我是否必须在堆上容纳所有内容(存储在堆容器中)?

时间:2010-01-28 00:03:08

标签: c++ heap allocation

在使用new关键字时,我正在覆盖new运算符以手动分配堆空间。

通常使用堆栈分配的堆容器,其中包含指向其项目的指针 -

CArray<CObject*> objects;

- 很好。但我很挑剔,我想制作缓冲区 -

CArray<CObject> objects;

- 让我修改P​​OD类型。所以,我将它们分配到自然适合它们使用的堆栈上:

CVertex vertex;
objects.push_back(vertex);

但它破坏了堆(我有一个糟糕的星期)并且发出了一个疯狂的错误:

0xC0000017: Not Enough Quota.

我预先分配数组对象,然后在 push_back()内部使用=运算符。

我通过在堆上分配临时对象然后将它们添加到数组来解决了这个问题。但这似乎不对,我只是不明白。

根据要求,一些代码:

CArray::push_back( T& newElement )
{
m_internalElements[allocatedSize] = newElement;
allocatedSize++;
}

CArray::preallocate_and_initialize( size_t itemCount )
{
T* newInternalElements = mem::allocate_and_initialize( T, itemCount );
//copy over
}

请注意,这一切都适用于堆分配的 CVertex ,因为我在缓冲区元素的二进制搜索中使用这些对象(在给定顶点的索引缓冲区中找到正确的项目)和它构建一个完美的网格!

2 个答案:

答案 0 :(得分:1)

0xC0000017STATUS_NO_MEMORY。即,你耗尽了虚拟地址空间,即你使用的内存太多了。

如果您希望拥有大量元素,则在重复调用push_back之前保留空间应该足以避免内存不足。您可以使用CArray::SetSize(0, itemCount)为所有元素预留空间。

答案 1 :(得分:0)

CVertex是从CObject派生的?如果CVertex有更多的实例数据,你就无法做到这一点。 (我的意思是你不能创建一个CObject数组并在其中放入CVertexes) 编译器在CObject数组中创建插槽的大小,它们将是CObject大小,然后你会尝试在插槽中放置更大的东西 - &gt;砰

你应该在你的数组中放置boost :: shared_ptr对象。一旦你有了这个成语,你将永远不会回去