pau*_*l23 6 c++ memory-management stl
在查看我的代码时,我看到我使用的一些"丑陋"结构,在一个类(称为"map")中我有一个包含"data"类的向量:
std::vector<PointerToHUGEClass> vector;
Run Code Online (Sandbox Code Playgroud)
其中PointerToHUGEClass就像名称所描述的那样.(尽管指向的对象也由map类拥有,并且在构造函数中使用"new"参数创建).这一切都很好(目前).但是我仍然觉得这更像是一种解决方法.
我使用"PointerToHUGEClass"而不仅仅是"HUGEClass" 的唯一原因是因为我想确保不从堆栈声明对象.然而,在我理解分配器之前,这是做的.现在我觉得分配器的任务或多或少是为了确保不从堆栈声明内存.
我的问题:
再次感谢,paul23
- 假设分配器负责物品的内存管理,我是否正确?(并确保从堆栈/ freestore/heap /中声明它)
不,你不是.分配器只是糖衣过new,并delete和一般负责决定的,其中内存将被分配.调用的责任allocate,deallocate,construct并destruct为它的用户(这意味着在这里std::vector).从你的角度来看,它将是自动的,毕竟这里至关重要.
- std :: allocator做什么? - 它是从堆栈还是从堆声明的?
std::allocator被授权分配使用::operator new(size_t),因此它取决于全局new运算符的定义.通常,这意味着堆.堆栈用于具有自动存储持续时间的对象.
- (从上一个问题开始跟进):如果我将堆栈中声明的项目复制到数据结构中,它是否仍在堆中声明?
如果复制项目,则会在复制项目时分配副本.这意味着将项目从堆栈复制到堆.然后,您有两个对象副本,这意味着一个副本上的更改不会反映在另一个副本上.
请注意,我们正在讨论默认的复制模式,即浅层复制.如果你复制一个对象,它将被复制得很好; 如果复制指针,则只复制指针,而不复制指向的数据.