2014-01-23 1 views
0

주로 C++에서 몇 가지 메모리 문제에 대한 이해를 돕기 위해 포인터가 포함 된 컨테이너를 사용합니다.컨테이너 멤버의 메모리 해제

header.h가

#include <iostream> 
#include "Header.h" 

int main(int argc, const char * argv[]) 
{ 
    ClassA objA(5); 
    ClassB objB; 

    return 0; 
} 

ClassA::ClassA(int n) { 
    intPtr = new int[n]; 
} 
ClassA::~ClassA() { 
    delete intPtr; 
} 

ClassB::ClassB() { 
    vecPtr = vector<ClassA*>(0); 
} 

ClassB::~ClassB() { 
    //no destructor needed 
} 

void ClassB::someFunc() { 
    //vecPtr = something using new; 
    int* testPtr = new int[vecPtr.size()]; 
    //do stuff 
    delete testPtr; 
} 

vecPtr 이제까지 삭제해야합니까

#ifndef test_Header_h 
#define test_Header_h 

#include <vector> 

using std::vector; 

class ClassA { 
    int* intPtr; 

public: 
    ClassA(int n); 
    ~ClassA(); 
}; 

class ClassB { 
    vector<ClassA*> vecPtr; 

public: 
    ClassB(); 
    ~ClassB(); 

    void someFunc(); 
}; 

#endif 

MAIN.CPP : 나는 이런 식으로 뭔가를 말? 아니면 소멸자 ClassA이 나를 위해이 일을 완수합니까? 또한 vector 대신에 list 포인터 나 pair을 사용하면 동일한 상황이 발생합니까? 마지막으로, 설명을 위해 testPtrsomeFunc에서 삭제되어야합니다. 왜냐하면 그것이 선언 된 범위이기 때문에 소멸자에 넣는 것은 의미가 없습니다. testPtr이 중요한 회원의 주소와 주소를 공유했다면 삭제하는 것이 중요한 회원입니까? 나는 몇 가지 질문이 있다는 것을 알고 있지만, 나는 내 머리 속에서 순환 논쟁으로 돌아가고 있다고 생각한다. 점점 혼란스러워진다.

+0

intPtr에'new int [n];을 (를) 할당 했으므로 delete []로 할당을 해제해야합니다. [문서] (http://www.cplusplus.com/reference/new/operator%20delete [] /)를 참조하십시오. – user2079303

+0

usecase 추측 : 모든 vecPtr 요소를 명시 적으로 '삭제'해야하며 대상 벡터에서 사용할 포인터의 내용을 복사하는 복사 생성자/할당을 제공해야합니다. – qwm

+0

'new'로 생성 한 것을'삭제 '해야합니다. –

답변

2

vecPtr은 포인터가 아니기 때문에 삭제할 필요가 없습니다. 이것은 vecPtr에있는 포인터와 다를 수 있으며 해당 포인터에 대한 소유권을 가진 사용자에 따라 다릅니다.

예, 사용할 수있는 경우 testPtr을 삭제해야합니다. 다른 것은 컴파일되지 않습니다. testPtr을 멤버로 지정하고 삭제하면 소멸자에서 멤버가 삭제 될 때 이중 자유 또는 손상 오류가 발생할 가능성이 높습니다.

일반적으로 무언가를 삭제해야하는 곳은 구현 단계까지입니다. 당신이 알아야 할 유일한 것은 새로운 모든 코드 경로의 어딘가에서 정확히 하나의 삭제 가져옵니다. 따라서 생성자/소멸자는 보통 좋은 장소입니다.

0

여기에 큰 문제가 있습니다. 다음을 기억하십시오 :

1) newdelete과 균형을 유지해야합니다.

2) 모든 new[]delete[]과 균형을 유지해야합니다.

사실, 이들을 혼합 한 경우 은 정의되지 않은 동작입니다. 붐! 당신은 또한 delete[] intPtr;delete[] testPtr;

를 작성하고 당신이 new vecPtr를 작성하지 않았기 때문에 간단하게, 당신은 delete vecPtr를 작성하지 않는 넣을 필요가있다.

내부적으로 C++ 런타임은 new[]을 사용하여 할당 한 요소의 수를 기억합니다. 해당 런타임에 해당 정보에 액세스 할 수있게하려면 delete[]을 사용해야합니다.