2012-12-22 3 views
1

객체 포인터 벡터가 있습니다. 나는 그 객체들을 지울 수 있고 그 객체들에 의해 차지 된 메모리를 자유롭게 할 수 있기를 원한다. 이 메모리를 벡터의 요소를 삭제하고 해제하는 기능이스택에 할당 된 객체 포인터 벡터에서 요소 삭제

std::vector<Ball*> List; 

:

이 객체 포인터를 포함하는 벡터이다 :

는 내가 현재 가지고하는 것은 이것이다

void BallManager::DeleteBall(int id) 
{ 
    List[id]->~Ball(); //Not sure if this is needed 
    delete List[id]; 
    List[id] = NULL; 
    List.erase(List.begin()+id); 
} 

제 질문은 객체에 대한 소멸자를 호출해야합니까, 아니면 삭제로 처리 했습니까?

+3

내가 매우 좋습니다

std::vector<Ball*> List; void BallManager::DeleteBall(int id) { if (id < List.size()) // should check id is still in range { delete List[id]; List.erase(List.begin()+id); } } 

는 강하게 크리스가 언급 한 바와 같이 당신이 STL 컨테이너 아래 데모에서 요소를 삭제하면 다음 개체 포인터를 삭제에 대해 걱정할 필요가 없습니다, 스마트 포인터를 사용하는 운영자 추천 대신 스마트 포인터의 벡터. 포인터의 메모리 관리에 대해 걱정할 필요가 없습니다. 단순히'erase'를 호출하면 메모리와 모든 것을 할당 해제 할 수 있습니다. – chris

답변

2

포인터 요소를 삭제하려면 delete이 개체 소멸자를 호출합니다. List[id]->~Ball()을 호출 할 필요가 없으므로 어쨌든 요소를 ​​지우므로 NULL에 대한 포인터를 설정할 필요가 없습니다.

std::vector<std::shared_ptr<Ball> > List; 
    void BallManager::DeleteBall(int id) 
    { 
    if (id < List.size()) // should check id is still in range 
    { 
     List.erase(List.begin()+id); 
    } 
    } 
0

소멸자를 명시 적으로 호출 할 필요가 거의 없습니다. 할당 해제 프로세스를 통해 호출됩니다. 동적 할당 객체의 경우 삭제됩니다.

자세한 내용은 약 절반 아래로 Destructors FAQ을 참조하십시오.

1

아니요, 호출 삭제 (dealloc과 반대)는 자동으로 소멸자를 호출합니다.

요소를 삭제 한 후에도 null로 설정할 필요가 없습니다. 삭제할 수 있습니다.

void BallManager::DeleteBall(int id) 
{ 
    delete List[id]; 
    List.erase(List.begin()+id); 
} 

new는 자동으로 생성자를 호출하고 해당 삭제는 자동으로 소멸자를 호출합니다.