2

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

通常使用带有指向其项目的指针的堆栈分配的堆容器-

CArray<CObject*> objects;

-很好。但我很挑剔,我想做缓冲——

CArray<CObject> objects;

- 让我修改 POD 类型。因此,我将它们分配在自然适合它们使用的堆栈上:

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,因为我在缓冲区元素的二进制搜索中使用这些对象(在给定顶点的索引缓冲区中找到正确的项目)并且它构建了一个非常好的网格!

4

2 回答 2

1

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

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

于 2010-01-28T00:55:02.427 回答
0

CVertex 是从 CObject 派生的?如果 CVertex 有更多实例数据,则不能这样做。(我的意思是你不能创建一个 CObjects 数组并将 CVertexes 放入其中)编译器应该在 CObject 数组中创建多大的插槽,它们将是 CObject 大小的,然后你将尝试在插槽中放入更大的东西 -> bang

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

于 2010-01-28T01:04:55.570 回答