2013-08-08 3 views
-2

저는 현재 포인터가 없어서 매우 큰 구조체> 13MB입니다. 내 문제는 그것을 클래스에 저장하는 방법입니다.BIG (> 13MB) 구조체 용 STL 컨테이너

클래스의 일부인 경우 stackoverflow가 발생합니다. 포인터를 사용하면 클래스를 복사해야 시작할 때까지 문제가 해결됩니다. 그러면 지옥이 시작됩니다. (클래스에는 많은 멤버가 있기 때문에).

STL 벡터 및 배열로 tryed하지만 여전히 stackoverflow 가져옵니다. 스택에 구조체를 넣지 않지만 메모리를 직접 할당하는 STL 컨테이너입니까?

이렇게하면 모든 것이 제대로 완료 될 수 있습니다.

감사합니다.

UPDATE :

예제 코드 :

//HEADER 
#include <vector> 
struct BigStruct { //This is untouchable or divisible into an array of arrays 
    char a[1000]; 
    int b[1000][1000]; 
    long c[1000000]; 
    // etc... 
}; 

class Foo 
{ 
    std::vector<BigStruct> a; //It has to be here since is related to this instance of the class 

public: 
    Foo(); 
    //All the other funcs and method 
    // ... 

    //All the other variables are from STL 
    // ... 
}; 

//CPP 
Foo::Foo(){ 
a.resize(1); 
} 
+1

std :: vector는 힙에 할당되므로 스택 오버 플로우가 발생하지 않아야합니다. – Borgleader

+0

스택은 일반적으로 몇 MB 정도이므로 로컬 변수로 선언하면 스택 오버플로가 발생합니다. –

+3

이 15MB 인 경우 스택에서 로컬 변수로 사용할 수있는 일반 클래스로 사용하고 한 곳에서 다른 곳으로 계속 복사하면 ... 실제 디자인 문제가 있습니다. –

답변

0

난 그냥 내 자신의 질문에 대답하고있다. resize()를 호출하면 std :: vector는 스택에 BigStruct 유형의 요소를 만든 다음 지정한 횟수만큼 복사합니다. (복사 파괴 이동)

Foo::Foo(){ 
BigStruct * temp = new BigStruct; 
a.clear(); 
a.push_back(*temp); //Element is reserved and copied directly from temp. 
delete temp; 
} 

이 완전히 스택 문제를 해결하고, 휴대를 허용하는 부모 클래스의 :

이 동작

는 다음과 같이 벡터의 요소를 생성 방지 할 수 있습니다.

+1

그리고 매번 13MB의 메모리가 누출됩니다. 스택 메모리 문제는 실제로 해결되었습니다. – MSalters

+0

아, 네, 끝에 임시 삭제가 필요합니다. Sry. – DarkZeros

+0

나는 똑똑한 포인터를 사용했을 것이다. 여전히 누수가 있지만'.push_back'이 던져진 경우에만 그렇다. – MSalters