记忆管理&的std ::分配器

时间:2010-11-23 10:01:49

标签: c++ stl memory-management

在查看我的代码时,我看到我使用的一些“丑陋”结构,在一个类(称为“map”)中我有一个包含“data”类的向量:

std::vector<PointerToHUGEClass> vector;

其中PointerToHUGEClass就像名称所描述的那样。 (尽管指向的对象也由map类拥有,并且在构造函数中使用“new”参数创建)。这一切都很好(目前)。但是我仍然觉得这更像是一种解决方法。

我使用“PointerToHUGEClass”而不仅仅是“HUGEClass”的唯一原因是因为我想确保不从堆栈声明对象。然而,在我理解分配器之前,这是做的。现在我觉得分配器的任务或多或少是为了确保不从堆栈声明内存。

我的问题:

  • 假设分配器负责项目的内存管理,我是否正确? (并确保从堆栈/ freestore / heap /中声明它)
  • std :: allocator有什么作用? - 它是从堆栈还是从堆中声明的?
  • (从上一个问题开始跟进):如果我将堆栈中声明的项目复制到数据结构中,它是否仍在堆中声明?

再次感谢, paul23

2 个答案:

答案 0 :(得分:9)

  
      
  • 假设分配器负责项目的内存管理,我是否正确? (并确保从堆栈/ freestore / heap /中声明它)
  •   

不,你不是。分配器只是newdelete上的糖涂层,并且通常负责决定分配内存的 。致电allocatedeallocateconstructdestruct的责任在于其用户(此处为std::vector)。从你的角度来看,它将是自动的,毕竟这里至关重要。

  
      
  • std :: allocator有什么作用? - 它是从堆栈还是从堆中声明的?
  •   

std::allocator被授权使用::operator new(size_t)进行分配,因此它取决于全局new运算符的定义。通常,这意味着堆。堆栈用于具有自动存储持续时间的对象。

  
      
  • (从上一个问题开始跟进):如果我将堆栈中声明的项目复制到数据结构中,它是否仍在堆中声明?
  •   

如果复制项目,则会在复制项目时分配副本。这意味着将项目从堆栈复制到堆。然后,您有两个对象副本,这意味着一个副本上的更改不会反映在另一个副本上。

请注意,我们正在谈论默认复制模式,即副本。如果你复制一个对象,它将被复制得很好;如果复制指针,则只复制指针,而不是指向的数据。

答案 1 :(得分:0)

你的答案:

  • 是的,你是对的。无论如何,如果容器的模板类型是指针,就像你的情况一样,容器将为指针分配/释放内存,而不是指针所指向的对象!

  • 这取决于实施,在标准的20.2.5美元中描述了分配者的要求。

  • 由于您存储指针,我担心这个问题的答案会让您感到困惑。如果将容器中的 复制到指向堆栈中分配的对象的指针,则对象将保留在堆栈中。一旦你离开范围,它将被销毁,你将在容器中有一个无效的指针。

HTH