2013-03-01 2 views
0

동적으로 할당 된 배열을 삭제하는 데 약간의 문제가 있습니다. 이유는 100 % 확신 할 수 없습니다. 이 배열에 할 일은 개별적으로 (for 루프에서) 일부 값을 복사하는 것입니다. 다른 루틴에서는 제대로 작동하는 것으로 확인됩니다. 생성자동적 배열 삭제로 인한 Seg 오류

std::complex<float> * frameData; 

실체화 : 여기서

클래스에서 선언이다

this->frameData = new std::complex<float>[n]; 
srand(time(NULL)); 
std::complex<float> randUnityRoot; 

for(int i = 0; i < this->n; i++){ 
    randUnityRoot = std::polar(1.0, 2*M_PI * (rand() % 1000000)/1e06); 
    this->frameData[i] = randUnityRoot; 
} 

소멸자 삭제 (이것은 역 추적 언급 라인 70) :

delete[] this->frameData; 

프로그램 완료시 segfault 후 gdb 백 추적 :

(gdb) f 4 
#4 0x00007ffff7bc579c in Frame::~Frame (this=0x602940, 
__in_chrg=<optimized out>) at Frame.cpp:70 
70  delete[] this->frameData; 
(gdb) f 3 
#3 0x00007ffff7669b96 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) f 2 
#2 0x00007ffff765f39e in ??() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) f 1 
#1 0x00007ffff7624b8b in abort() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) f 0 
#0 0x00007ffff7621425 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) 

나는 잠시 동안 이것을보고 있었고 아이디어가 옳다. 나는 하이브 정신으로 돌아갈 것이라고 생각했습니다. 더 자세한 정보가 필요하시면 알려주십시오. 감사!

편집 : 모든 것을 벡터 및 벡터 기반 접근 방식으로 업데이트했습니다.

아니요 segfaults :). ,

std::complex<float> * frameGet; 
frameGet = this->Frame->getFrame(); 
// Do stuff with frameGet 
//THIS NEXT LINE IS THE BAD PART 
delete[] frameGet; 

절반 질문 절반 주장 :

는 다른 클래스에서 내가 좋아하는 일이라고했다,이 그러나에서 "지식을 얻었다"어떤 종류의를 생성하려면 [] frameGet 호출 원래 배열의 내용을 삭제 삭제 하시겠습니까? frameGet 같은 것을해야 삭제해야하는 경우 :

frameGet = NULL; 
delete frameGet; 
+2

아마 : 관련 항목 : [Rule of Three] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three). 벡터를 사용하십시오. – chris

+0

코드를 공유하십시오. –

+0

@chris. 그래, 내가 여기서 할 수있어. 그러나 실제로 이것은 일어나서는 안됩니다. –

답변

0

당신은 아마 복사의 ctor도 할당 연산자 중 하나가 명시 적으로 클래스에 정의가 없습니다. 그래서 클래스의 민간 부분에서 그들을 설명 (다음 액세스 할 수 없게) :

class Frame { 
//... 
private: 
    Frame(const Frame &); 
    Frame &operator=(const Frame &); 
// ... 
}; 

당신도 그들을 구현하지 않고 컴파일러가 문제가 컴파일 오류입니다 정확한 위치가 표시됩니다.

질문의 후반부입니다. 어떤 이유로 한 원시 포인터를 다른 포인터에 할당하면 해당 메모리를 복사하고 별도로 삭제해야한다고 생각합니다. 그 경우가 아니라면, 미가공 포인터는 메모리의 숫자 주소 일뿐입니다. 따라서 :

int *pi = new int[N]; // now pi has address of memory reserved by new, lets say 0x1234 
int *api = pi; // now api has the same address 0x1234 as pi 
delete[] api; // you tell environment that you do not need memory at address 0x1234 anymore 
delete[] pi; // you tell environment that you do not need memory at address 0x1234 again, which is error 

사실 하나의 포인터를 다른 포인터에 직접 할당하거나 함수 결과 나 매개 변수를 통해 전달하면 아무 것도 변경되지 않습니다.

+0

글쎄, 개별 변수 요소에 액세스하는 것 이외의 다른 배열을 사용하지 않을 때 복사 생성자가 필요한 이유는 무엇입니까? ** float something = this-> frameData [i] .re() + 3 ** –

+0

@ 스티브 요점은 우리가 어딘가에 조용히 복사하지 않는다고 정말로 믿지 않는다는 것입니다. copy ctor 및 copy assignment를 액세스 할 수 없게 만들고 재 컴파일하면 의심 할 여지없이이 일이 일어나지 않을 것입니다. – us2012

+0

@SteveStevens는 코드에 2 줄을 넣고 컴파일하는데 너무 오래 걸리지 않을 것입니다. 이유를 묻기 전에 왜 시도하지 않으시겠습니까? – Slava