内存管理&std :: allocator

pau*_*l23 6 c++ memory-management stl

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

std::vector<PointerToHUGEClass> vector;
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题:

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

再次感谢,paul23

Mat*_* M. 9

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

不,你不是.分配器只是糖衣过new,并delete和一般负责决定的,其中内存将被分配.调用的责任allocate,deallocate,constructdestruct为它的用户(这意味着在这里std::vector).从你的角度来看,它将是自动的,毕竟这里至关重要.

  • std :: allocator做什么? - 它是从堆栈还是从堆声明的?

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

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

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

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