【问题标题】:Creating an object on the heap without new在没有 new 的情况下在堆上创建对象
【发布时间】:2011-07-07 13:39:23
【问题描述】:

在 C++ 中,是否可以在不使用 newmalloc 的情况下在堆上创建对象?

我想如果我使用像vector 这样的 STL 容器,它将被放入堆中。如果我这样做:

vector<Object> listObjs = vector<Object>();

Object x = Object(...);
...
listObjs.push_back(x);

这里创建的对象驻留在哪里?

【问题讨论】:

  • malloc() 不应在 C++ 中使用。
  • 可以在C++中使用malloc;你只需要小心不要期望它调用构造函数。
  • vector 将其对象放在某处。除非您正在编写分配器对象或类似的东西,否则您无需担心它们的内存是在堆上、堆栈上还是在计算机的灰尘中。
  • 虽然如果你的量子 CPU 写在灰尘兔子上,你可能还希望考虑屏蔽太阳辐射和野兽。

标签: c++ memory-management stl heap-memory


【解决方案1】:

x 表示的对象驻留在堆栈上。 vector::push_back 会将其复制到堆中。

vector 中的allocator 对象可能会使用newmalloc 实现,尽管它可能使用另一个低级API。例如,Unix 和 Windows 都提供内存映射 API,而这些 API 又可用于实现 mallocnew 和分配器。

【讨论】:

  • 这是否意味着我在push_back()之后将创建的对象扔掉了?
  • @pessimo:是的。 Vector 制作副本。
  • 另外,我认为vector 被允许使用“小型容器优化”,在这种情况下push_back 会将元素复制到堆栈上的某个位置(在listObjs 对象内)直到那是满的,然后向量会调整大小。
  • @SteveJessop:是的;它可以分配到任何它喜欢的地方。但是,如果元素在 freestore 上(请不要“堆”,伙计们),那么在某个时候,某处某处正在执行 malloc 系统调用。
  • @Steve Jessop:我还没有阅读标准中的vector 规范。我想它不会禁止您进行优化,但是对于任何大小超过微不足道的vector,这不会浪费大量堆栈空间吗?
【解决方案2】:

std::vector 正在那里做new

【讨论】:

  • 严格来说是在做std::allocator::allocate。我不确定是否需要该函数才能从 new 获取内存。
  • @larsmans:不是。我正在简化一点;射击我。 ;) 但是,如果元素在 freestore 上,那么在某个级别,某处某处正在执行 malloc 系统调用,并且默认情况下,在大多数 stdlib 实现中通过 new 进行。
  • @larsmans: 如果std::allocator&lt;Object&gt; 被用户特化,那么它可以做任何事情,否则未特化的模板使用全局运算符 new (20.4.1.1/6)。
【解决方案3】:

来自 C#/java ?

std::vector&lt;Object&gt; listObjs; 在堆栈上创建一个容器,用于管理在堆上分配的 Object 数组

listObjs.push_back(Object());分配一个大小为+1的数组,将旧数组复制到新数组,并将Object()赋值给最后一个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2014-10-02
    • 2016-07-09
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多