Нужно ли выделять все в куче (которая хранится в) контейнерах кучи? - PullRequest
2 голосов
/ 28 января 2010

Я переопределяю новый оператор, чтобы вручную выделять пространство кучи при использовании нового ключевого слова.

Обычно используется выделенный стеком контейнер с кучей с указателями на его элементы-

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 , так как я использую эти объекты в двоичном поиске элементов буфера (поиск нужного элемента в буфере индекса для данной вершины), и это отлично строит сетку!

Ответы [ 2 ]

1 голос
/ 28 января 2010

0xC0000017 - это STATUS_NO_MEMORY. Т.е. вы исчерпали виртуальное адресное пространство, т. Е. Используете слишком много памяти.

Если вы ожидаете, что будет много элементов, резервирования места перед повторным вызовом push_back должно быть достаточно, чтобы избежать нехватки памяти. Вы можете использовать CArray::SetSize(0, itemCount), чтобы зарезервировать место для всех ваших элементов.

0 голосов
/ 28 января 2010

CVertex является производным от CObject? Вы не можете сделать это, если CVertex имеет больше данных экземпляра. (Я имею в виду, что вы не можете создать массив CObjects и поместить в него CVertexes) Насколько велик должен компилятор сделать слоты в массиве CObject, они будут иметь размер CObject, тогда вы попытаетесь поместить что-то большее в слоты -> bang

Вы должны поместить объекты boost :: shared_ptr в ваш массив. Как только вы выработаете эту идиому, вы никогда не вернетесь

...