C++ 内存管理&;分配器
在查看代码时,我看到一些我使用的“丑陋”结构,在一个类(称为“map”)中,我有一个包含“data”类的向量:C++ 内存管理&;分配器,c++,stl,memory-management,C++,Stl,Memory Management,在查看代码时,我看到一些我使用的“丑陋”结构,在一个类(称为“map”)中,我有一个包含“data”类的向量: std::vector; Where PointerToHUGEClass就像名字描述的那样。(尽管指向的对象也属于map类,并且是使用构造函数中的“new”参数创建的)。(目前)这一切都很好。然而,我仍然觉得这更像是一项工作 我之所以使用“PointerToHUGEClass”而不仅仅是“HUGEClass”,是因为我想确保对象没有从堆栈中声明。然而,这是在我理解分配器之前做出的。
std::vector;
Where PointerToHUGEClass就像名字描述的那样。(尽管指向的对象也属于map类,并且是使用构造函数中的“new”参数创建的)。(目前)这一切都很好。然而,我仍然觉得这更像是一项工作
我之所以使用“PointerToHUGEClass”而不仅仅是“HUGEClass”,是因为我想确保对象没有从堆栈中声明。然而,这是在我理解分配器之前做出的。现在我觉得分配器的任务或多或少是确保内存不从堆栈中声明
我的问题是:
- 我假设分配器负责项目的内存管理,对吗?(并确保它是从stack/freestore/heap/where声明的)
- std::分配器做什么它是从堆栈声明还是从堆声明
- (上一个问题的后续问题):如果我将堆栈中声明的项复制到数据结构中,它仍然在堆中声明吗
- 是的,你说得对。无论如何,如果容器的模板类型是指针(如您的情况),那么容器将为指针分配/取消分配内存,而不是指针所指向的对象
- 这取决于实现,在标准的$20.2.5中描述了分配器的要求
- 由于您正在存储指针,我担心这个问题的答案会让您感到困惑。如果在容器中复制指向堆栈中分配的对象的指针,则对象将保留在堆栈中。一旦超出范围,它将被销毁,容器中的指针将无效
- 我假设分配器负责项目的内存管理,对吗?(并确保它是从stack/freestore/heap/where声明的)
new
和delete
的糖衣,通常负责决定内存将分配到哪里。调用allocate
、deallocate
、construct
和destruct
的责任由用户承担(这里的意思是,std::vector
)。从你的观点来看,它是自动的,这毕竟是这里最重要的
- std::分配器做什么它是从堆栈声明还是从堆声明
std::allocator
被强制使用::operator new(size\u t)
进行分配,因此它取决于全局new
运算符的定义。通常,这意味着堆。堆栈用于具有自动存储持续时间的对象
- (上一个问题的后续问题):如果我将堆栈中声明的项复制到数据结构中,它仍然在堆中声明吗
不过要注意,我们讨论的是默认复制模式,即浅复制。如果你复制一个对象,它会被很好地复制;如果复制指针,将只复制指针,而不复制指向的数据。@Simone:hmm该代码应为
std::vector
或std::vector
,谢谢注意。(虽然这并没有真正改变我的问题,但问题更一般,因为这是我一年来一直在思考的问题)您能告诉我std::allocator在哪里被授权使用::operator new吗?我在标准中找不到引用。@Simone:我是根据Steve Jessop的回答得出的,据我所知,这个答案没有提到C++0x的最终草案(因为20.4是关于元组的)。我在草稿中找不到它。我把接线员的签名编辑得更准确些。
std::vector<PointerToHUGEClass> vector;