2011-11-24 3 views
0

클래스의 public 멤버 함수에서 가져온 포인터 또는 포인터를 벡터에 대한 포인터로 반환한다는 의미에 대해 빠른 질문이 있습니다.C++에서 public 멤버 함수에서 포인터의 벡터/맵을 반환하는 중

여기

는 클래스 B

vector<A*>* ClassB::getfunction(){ 
    returns m_test; 
} 

M_TEST 포인터의 벡터에 형 포인터의 클래스 B의 개인 데이터 멤버의 멤버 함수입니다 :

여기 내 코드입니다. 이 객체는 힙에서 초기화되어 클래스 소멸자 (벡터의 모든 요소 포함)에서 삭제해야합니다.

다음과 같이 함수를 사용합니다.

B* ex_B = new B(); 

vector<A*>* ex_ptr_vecA = new vector<A*>; 

ex_ptr_vecA = ex_B->getfunction(); 

내 질문 :

I 메모리가 모두 힙에 할당되어있어 두 객체가 내가 그들 모두를 삭제해야합니다했기 때문에?

주문이 중요하며 다음 사항이 맞습니까?

B* ex_B = new B(); 

vector<A*>* ex_ptr_vecA = new vector<A*>; 

ex_ptr_vecA = ex_B->getfunction(); 

//do something with ex_ptr_vecA 
//Then I want to delete the allocate memory to the heap 

//delete class B first 
delete ex_B; 

//and then the vector 
//need to loop over vector elements and delete one at a time 
for(int i =0; i < ex_ptr_vecA; i++){ 
    delete ex_ptr_vecA->at(i); 
} 

delete ex_ptr_vecA; 

B 클래스의 소멸자가 이미 힙 메모리 할당을 취소했기 때문에 포인터가 잘못되었거나 삭제하려고합니까? 내가 선을

ex_ptr_vecA = ex_B->getfunction(); 

컴파일 생각하지 않지만

답변

1
B* ex_B = new B(); 
vector<A*>* ex_ptr_vecA = new vector<A*>; 

여기서 2 블록의 메모리를 할당하고 해당 블록 변수의 시작 부분의 주소를 해당 포인터 변수에 저장했습니다. 괜찮아.

ex_ptr_vecA = ex_B->getfunction(); 

이제 어떤 주소 getfunction() 반환과 ex_ptr_vecA를 재 할당했습니다. 새로운 vector<A*>이 반환 한 주소를 더 이상 보유하지 않아 더 이상 해제 할 수 없으므로 메모리 누수가 발생합니다.당신은 단지 ex_B의 내부 vector<A*>에 대한 포인터가 필요하면

단순히 이런 말 :

vector<A*>* ex_ptr_vecA = ex_B->getfunction(); 

당신이 당신의 예제 코드에서 당신이 ex_B 클래스에 할당 한 같은 벡터에 ex_ptr_vecA 점을 보여 주었다 방법을 . ex_B이 내부 벡터를 소멸자에서 삭제하면 delete ex_ptr_vecA;은 삭제를 두 번 의미합니다. 이는 정의되지 않은 동작입니다.

1

(당신이 => "포인터의 벡터 포인터", "포인터의 벡터"지정), 당신은 단지 두 개의 삭제가 필요합니다. B는 ex_ptr_vecA에서 반환 된 포인터를 소유하므로 포인터 만 파괴됩니다. 수정 코드는 :

당신이 볼
B::B() : m_test(new vector<A*>()) {} 
B::~B() { delete m_test; } 

B* ex_B = new B(); 
vector<A*>* ex_ptr_vecA; 
ex_ptr_vecA = ex_B->getfunction(); 
// Do something 
delete ex_B; 

,이 코드에 대한 점은 모든 새가가 할당 및 할당 해제에 대해 생각 완화 같은 레벨의 코드에서 삭제 가지고 있다는 것입니다. 이 과정을 단순화하기 위해 RAII에 대해 읽어보십시오. 메모리가 다음에 액세스 될 것이다

new vector<A*> 

의해 할당 이후

+0

아 죄송합니다. 함수에서 포인터의 벡터에 대한 포인터를 반환해야합니다. 이것은 여전히 ​​나에게 같은 결과를 줄 것입니까? – MWright

+0

@MWright : 예, 그렇습니다. m_test가 B에 속하면 (읽기 : B의 ​​멤버 임) B 만 B를 삭제해야합니다. scoped_ptr 및 참조를 사용하여이를 명확하게 만들 수 있습니다. – thiton

+0

그러면 ex_B를 삭제하면됩니까? 위의 코드에 대한 해결책을 제시해 주시겠습니까? – MWright

0

할당

ex_ptr_vecA = ex_B->getfunction(); 

메모리 누출을 야기한다. 그 메모리에 대한 포인터가 없으므로 자유롭게 할 수있는 기회는 없습니다 ...

공유 스마트 포인터를 사용하는 것이 좋습니다. 그런 다음 할당 된 메모리를 해제하고 수행해야하는 순서를 잊어 버릴 수 있습니다. 그것.

+0

클래스 B의 소멸자가 메모리를 할당 해제 한 것처럼 ClassB를 삭제 한 경우입니까? – MWright

+0

왜 새 벡터 에 할당 된 메모리에 액세스 할 수 없습니까? – MWright

+1

그 메모리상의 포인터는 getfunction()에 의해 반환 된 다른 포인터에 의해 덮어 쓰기 때문에 ... – vitakot

관련 문제