内存管理和 std:: 分配器

2023-11-22

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

std::vector<PointerToHUGEClass> vector;

其中 PointerToHUGEClass 正如其名称所描述的那样。 (尽管所指向的对象也属于地图类,并在构造函数中使用“new”参数创建)。这一切都很好(目前)。但我仍然觉得这更像是一种解决方法。

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

我的问题:

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

再次感谢, 保罗23


  • 我假设分配器负责项目的内存管理是否正确? (并确保它是从 stack/freestore/heap/whatever 声明的)

不,你不是。分配器只是糖衣而已new and delete并一般负责决定where内存将被分配。打电话的责任allocate, deallocate, construct and destruct是针对其用户的(这意味着,std::vector)。从你的角度来看,这将是自动的,这毕竟是最重要的。

  • std::分配器有什么作用? - 它是从堆栈声明还是从堆声明?

std::allocator被授权分配使用::operator new(size_t),因此这取决于全局的定义new操作员。一般来说,这意味着堆。堆栈用于具有自动存储期限的对象。

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

如果您复制一个项目,则会在您复制它的位置分配一个副本。这里的意思是从栈中复制一个项目到堆中。然后,您将拥有该对象的两个副本,这意味着一个副本上的更改不会反映在另一个副本上。

但请注意,我们正在谈论的是default复制模式,即shallow复制。如果你复制一个对象,它会被很好地复制;如果复制指针,则只会复制指针,而不复制指向的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存管理和 std:: 分配器 的相关文章

随机推荐