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