2

new キーワードを使用するときにヒープ領域を手動で割り当てるために、new 演算子をオーバーライドしています。

通常、そのアイテムへのポインターを持つスタック割り当てヒープ コンテナーを使用します。

CArray<CObject*> objects;

-結構です。しかし、私は好き嫌いがあり、バッファーを作りたいです-

CArray<CObject> objects;

-これにより、POD タイプを変更できました。したがって、それらの使用に自然に適したスタックにそれらを割り当てます。

CVertex vertex;
objects.push_back(vertex);

しかし、それはヒープを破損し (私はそれらの悪い週の 1 つを経験しました)、クレイジーなエラーを出します:

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

0xC0000017ですSTATUS_NO_MEMORY。つまり、仮想アドレス空間を使い果たしました。つまり、メモリを使いすぎています。

多くの要素があると予想される場合は、push_back繰り返し呼び出す前にスペースを確保するだけで、メモリ不足を回避できます。を使用CArray::SetSize(0, itemCount)して、すべての要素のスペースを確保できます。

于 2010-01-28T00:55:02.427 に答える
0

CVertex は CObject から派生していますか? CVertex にもっと多くのインスタンス データがある場合、それはできません。(つまり、CObject の配列を作成してその中に CVertex を配置することはできません) コンパイラが CObject 配列のスロットをどのくらいの大きさにする必要があるか、それらは CObject のサイズになります。次に、スロットにもっと大きなものを配置しようとします -> bang

boost::shared_ptr オブジェクトを配列に配置する必要があります。その慣用句を解決したら、二度と戻れません

于 2010-01-28T01:04:55.570 に答える