Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内存管理&;分配器_C++_Stl_Memory Management - Fatal编程技术网

C++ 内存管理&;分配器

C++ 内存管理&;分配器,c++,stl,memory-management,C++,Stl,Memory Management,在查看代码时,我看到一些我使用的“丑陋”结构,在一个类(称为“map”)中,我有一个包含“data”类的向量: std::vector; Where PointerToHUGEClass就像名字描述的那样。(尽管指向的对象也属于map类,并且是使用构造函数中的“new”参数创建的)。(目前)这一切都很好。然而,我仍然觉得这更像是一项工作 我之所以使用“PointerToHUGEClass”而不仅仅是“HUGEClass”,是因为我想确保对象没有从堆栈中声明。然而,这是在我理解分配器之前做出的。

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

std::vector;
Where PointerToHUGEClass就像名字描述的那样。(尽管指向的对象也属于map类,并且是使用构造函数中的“new”参数创建的)。(目前)这一切都很好。然而,我仍然觉得这更像是一项工作

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

我的问题是:

  • 我假设分配器负责项目的内存管理,对吗?(并确保它是从stack/freestore/heap/where声明的)
  • std::分配器做什么它是从堆栈声明还是从堆声明
  • (上一个问题的后续问题):如果我将堆栈中声明的项复制到数据结构中,它仍然在堆中声明吗
再次感谢, paul23

您的答案:

  • 是的,你说得对。无论如何,如果容器的模板类型是指针(如您的情况),那么容器将为指针分配/取消分配内存,而不是指针所指向的对象

  • 这取决于实现,在标准的$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;