2014-11-05 3 views
1

클래스 내에 const std::vector<double> *vecPtr이 있습니다. 정확하게 메모리를 할당 해제하고 싶습니다. 그래서 내 destructor은 어떻게 생겼을까요? 벡터에 대한 포인터 삭제

나는 ~ClassA() { delete[] vecPtr; }을 시도,하지만 난

*** Error in `./test': free(): invalid pointer: 0x00007fff8c643a98 *** 
Aborted (core dumped) 

delete[] 작업 벡터가 포인터로 가득 경우에만 오류가?

편집 :

이 같은 vecPtr 사용 : 내가 사용하는 경우 vecPtr = &vec;

그냥 delete 내가 *** Error in ./test': double free or corruption (fasttop): 0x00000000008fcb20 ***

+0

벡터에 대한 포인터는 거의 항상 오류입니다. 대신 벡터를 사용해보십시오. –

+0

왜 그런가? 나는 복사를 피하고 싶다. – TheGuyWithStreetCred

+0

반원에게 '*'을 붙여서 복사하는 것을 피할 수 없다. –

답변

5

작성 방법에 따라 달라집니다. vecPtr. 당신이 vecPtr = new std::vector<double>을 사용한 경우 vec 경우, 당신은 vecPtrarray new에 의해 같은 vecPtr = new std::vector<double>[3];을 만든 경우 vecPtr = &vec;을 사용한 경우 delete[] vecPtr;

편집

, 당신은 array delete을 사용해야 delete vecPtr;

를 사용한다 자동 메모리를 사용하는 자동 변수 또는 vec은 정적 메모리 또는 정적 변수를 사용하는 전역 변수이므로 삭제하지 말고 자동으로 할당을 해제합니다 어. 동적 메모리 만 삭제할 수 있습니다.

4

는 [] 제거 얻을. 배열 삭제에 사용됩니다.

delete vecPtr; 

많은 이유가 없으므로 벡터에 대한 포인터를 사용해서는 안됩니다.

0
const std::vector<double> *vecPtr 

vecPtr은 "벡터"에 대한 포인터, 즉 단일 개체입니다. 그것을 배열로 생각하지 말고 array delete 호출을 사용하십시오 (어쨌든 이전 버전과 호환되는 C 배열을 위해 있습니다). 그러나 그것을 객체 포인터라고 생각하십시오.

const vecarray *vecPtr. 

당신은 분명히 delete vecPtr를 사용하여이를 삭제합니다 : 당신이 당신의 자신의 벡터 클래스를 작성한 경우

는 예를 들어, 당신이 가지고있는 것, 그것을 vecarray 호출 할 수 있습니다. 벡터 및 다른 stl 컨테이너 클래스도 마찬가지입니다.

0

글쎄, 당신의 편집 정말 명확히하지 않으며 실제로 더 많은 문제를 소개합니다. vec은 실제로 자동 변수이며 삭제되지 않아야합니까? 우리는 모른다.

그러나 다소 모호한 질문에 대답하려면 무료 저장소에 벡터를 할당하면 delete ptr으로 삭제해야합니다. ptr이 실제로 배열을 가리키면 배열 삭제를 delete [] ptr과 함께 사용해야합니다. 이것은 적어도 분명히 사실이 아닙니다. 벡터 주소를 ptr에 할당하는 경우에는 삭제하지 말아야합니다. 이와 같은 소유권의 충돌은 문제의 난교를 일으 킵니다.

관련 문제