在查看我的代码时,我看到我使用的一些“丑陋”结构,在一个类(称为“map”)中我有一个包含“data”类的向量:
std::vector<PointerToHUGEClass> vector;
其中PointerToHUGEClass就像名称所描述的那样。 (尽管指向的对象也由map类拥有,并且在构造函数中使用“new”参数创建)。这一切都很好(目前)。但是我仍然觉得这更像是一种解决方法。
我使用“PointerToHUGEClass”而不仅仅是“HUGEClass”的唯一原因是因为我想确保不从堆栈声明对象。然而,在我理解分配器之前,这是做的。现在我觉得分配器的任务或多或少是为了确保不从堆栈声明内存。
我的问题:
再次感谢, paul23
答案 0 :(得分:9)
- 假设分配器负责项目的内存管理,我是否正确? (并确保从堆栈/ freestore / heap /中声明它)
不,你不是。分配器只是new
和delete
上的糖涂层,并且通常负责决定分配内存的 。致电allocate
,deallocate
,construct
和destruct
的责任在于其用户(此处为std::vector
)。从你的角度来看,它将是自动的,毕竟这里至关重要。
- std :: allocator有什么作用? - 它是从堆栈还是从堆中声明的?
std::allocator
被授权使用::operator new(size_t)
进行分配,因此它取决于全局new
运算符的定义。通常,这意味着堆。堆栈用于具有自动存储持续时间的对象。
- (从上一个问题开始跟进):如果我将堆栈中声明的项目复制到数据结构中,它是否仍在堆中声明?
如果复制项目,则会在复制项目时分配副本。这意味着将项目从堆栈复制到堆。然后,您有两个对象副本,这意味着一个副本上的更改不会反映在另一个副本上。
请注意,我们正在谈论默认复制模式,即浅副本。如果你复制一个对象,它将被复制得很好;如果复制指针,则只复制指针,而不是指向的数据。
答案 1 :(得分:0)
你的答案:
是的,你是对的。无论如何,如果容器的模板类型是指针,就像你的情况一样,容器将为指针分配/释放内存,而不是指针所指向的对象!
这取决于实施,在标准的20.2.5美元中描述了分配者的要求。
由于您存储指针,我担心这个问题的答案会让您感到困惑。如果将容器中的 复制到指向堆栈中分配的对象的指针,则对象将保留在堆栈中。一旦你离开范围,它将被销毁,你将在容器中有一个无效的指针。
HTH