【发布时间】:2011-01-10 05:10:21
【问题描述】:
在使用 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,因为我在缓冲区元素的二进制搜索中使用这些对象(在索引缓冲区中为给定顶点找到正确的项目)和它可以完美地构建网格!
【问题讨论】:
-
如何在 operator= 中分配堆栈上的对象并期望它们在函数中存在?如果它们是,一旦你离开那个范围,它们就会死掉并给你留下一个悬而未决的参考。还是我误会了什么?
-
嗨 zneak,它们是通过调用构造函数预先分配的,然后 = 运算符在超出范围之前从堆栈实例复制字段。
-
您能否将代码发布到您的
operator new和CArray::push_back版本中 -
您是否在
push_back()的任何地方进行边界检查?还有一点,如果它适用于指针,但不适用于堆栈分配的对象,CVertex::operator=可能是问题所在。 -
完成 :) 复制 ctor 由 msvc++ 自动生成,它是 POD 类型:vec4 Pos; vec4 正常;我只是仔细检查了 CVertex 的大小,它是 sizeof(vec4)*2。
标签: c++ heap-memory allocation