2010-01-28 2 views
2

new 연산자를 재정 의하여 new 키워드를 사용할 때 수동으로 힙 공간을 할당합니다. 힙 컨테이너에 저장된 모든 것을 힙 컨테이너에 할당해야합니까?

보통의 항목 -

CArray<CObject*> objects; 

에 대한 포인터와 스택 할당 힙 컨테이너를 사용하여 미세 -is. 하지만 까다로운 그리고 난 내가 POD 유형을 수정할 수 있습니다 - 그건

CArray<CObject> objects; 

buffers- 만들고 싶어. 그래서 자연스럽게 그들의 사용에 적합 스택에이를 할당 :

CVertex vertex; 
objects.push_back(vertex); 

그러나 힙을 손상 (I 그 나쁜 주 중 하나를 했어)과 미친 오류 제공 :

0xC0000017: Not Enough Quota. 

배열 객체를 미리 할당 한 다음 내부적으로 = 연산자를 push_back()에 사용합니다.

임시 객체를 힙에 할당 한 다음 배열에 추가하여 문제를 해결했습니다. 그러나 그것은 옳은 것처럼 보이지 않으며, 나는 그것을 얻지 못합니다. 요청으로

, 일부 코드 : 나는에서 올바른 항목을 찾는 (버퍼 요소의 이진 검색에서 이러한 개체를 사용하고 같은 힙 모든 작품 CVertex 년대를 할당하는 것이

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 
} 

주 주어진 꼭지점을위한 인덱스 버퍼) 그리고 완벽하게 좋은 메쉬를 만듭니다!

+0

어떻게 연산자를 스택에 할당 할 수 = 그들과 함수를 통해 살기를 기대합니까? 그들이 존재한다면, 그 범위를 떠나 자마자 죽을 것이고 매달린 참조로 당신을 떠날 것입니다. 또는 나는 무엇인가를 오해 했느냐? – zneak

+0

안녕하세요, 그들은 생성자가 미리 할당 된 다음, = 연산자는 범위 밖으로 나가기 전에 스택 인스턴스에서 필드를 복사합니다. – Sorlaize

+0

'operator new'와'CArray :: push_back' 버전에 코드를 게시 할 수 있습니까 –

답변

1

0xC0000017STATUS_NO_MEMORY입니다. 즉 가상 주소 공간을 모두 소진했습니다. 즉, 너무 많은 메모리를 사용하고 있습니다.

많은 요소가있을 것으로 예상되는 경우 push_back을 반복적으로 호출하기 전에 공간을 확보하면 메모리 부족 현상을 피할 수 있습니다. CArray::SetSize(0, itemCount)을 사용하여 모든 요소의 공간을 예약 할 수 있습니다.

+0

아니, 그게 왜 그렇게 미친 짓이야! 이 문제가 발생하기 바로 전에 2GB를 할당 할 수 있습니다. – Sorlaize

+0

Win32에서 할당 할 수있는 인접 가상 메모리의 한계입니다. – MSN

0

CVertex는 개체에서 파생 되었습니까? CVertex가 더 많은 인스턴스 데이터를 가지고 있다면 그렇게 할 수 없다. (나는 당신이 CObjects의 배열을 만들 수없고 CVertexes를 넣을 수 없다는 것을 의미한다.) 컴파일러가 얼마나 큰지 CObject 배열에서 슬롯을 만들면, 그들은 CObject 크기가 될 것이고, 그러면 슬롯에서 더 큰 것을 넣으 려 시도 할 것이다.

배열에 boost :: shared_ptr 개체를 넣어야합니다. 일단 그 관용구가 작동하지 않으면 다시는 돌아 가지 않을 것입니다

+0

예,이 경우에는 CVertex 요소를 포함하는 CArray를 명시 적으로 사용합니다. DirectX 버퍼에 복사 할 연속 버퍼에 데이터가 필요하기 때문에 포인터를 사용하지 않습니다. :) – Sorlaize

관련 문제