2011-01-20 6 views
3

나는 다른 클래스 차량에 포인터의 배열을 가지는 클래스가있는 경우 : 내가 수동으로 반복 않습니다소멸자

class List { 
    public: 
     //stuff goes here 
    private: 
     Vehicle ** vehicles; 
} 

지금 클래스 List의 소멸자를 작성하는 경우 배열 (배열에 얼마나 많은 항목이 있는지 알고 있습니다) 및 delete을 모든 차량 포인터로 가져 오거나 C++이 배열의 모든 Vehicle의 소멸자를 자동으로 호출합니까? 내가 그렇게한다면 I에 대한 delete [] vehicles을 잊었지만 :

편집은 (개인 문자열이 있다면 그것을 수행처럼/... 클래스 또는 경우는 차량 포인터의 STL 컨테이너 것) , 배열의 모든 차량에서 사용하는 메모리를 삭제하거나 포인터가 사용하는 메모리를 삭제하겠습니까?

+0

'vector'와'boost :: scoped_ptr'를 사용하십시오. C++ 0x를 사용한다면'vector'와'std :: unique_ptr'을 사용하십시오. –

+0

@Alexandre 이것은 제가 택할 수있는 이전 시험의 작은 문제입니다. 시험에 허락한다면 벡터를 사용할 것입니다. – Aerus

+0

이 학교에서 도망칩니다. –

답변

6

배열의 모든 항목을 삭제하고 배열을 삭제해야합니다. C++ (STL)에는이 문제를 방지하는 메서드가 있습니다. 벡터를 사용하므로 배열을 삭제하지 않아도됩니다. Vehicle 당 scoped_ptr/shared_ptr을 사용하면 차량을 삭제할 필요가 없습니다.

+0

하나의 설명, STL은 C++ 표준 라이브러리의 하위 집합입니다. shared_ptr은 STL의 일부가 아니지만 C++ 표준 라이브러리 (곧 출시 될 C++ 0x와 Boost 컬렉션에 정의 됨)에 포함되어 있습니다. scoped_ptr은 Boost만의 C++ 표준 라이브러리 버전에 속하지 않습니다. – mloskot

0

차량을 수동으로 반복해야하고 각각 delete을 반복해야합니다.

3

목록에 Vehicle 객체가있는 경우 (생성자에서 해당 객체를 만드는 경우) 모든 단일 객체를 삭제 한 다음 포인터 배열 자체를 삭제해야합니다. 난 다른 클래스 차량 포인터 배열을 가지는 클래스가있는 경우

+2

+1 : 소유권에 관한 중요한 점. –

+0

+1 : STL과 같은 사용 가능한 더 나은 옵션에 관계없이이 개념을 이해하는 언어를 배울 때 중요합니다. 특별한주의를 기울이는 규칙은 새로운 []을 사용하여 할당 할 때 delete []를 사용하여 할당을 취소하거나 손상 문제가 발생해야한다는 것입니다. – gravitron

2

:

Vehicle ** vehicles;

vehiclesVehicle 타입 포인터는 포인터보다는 포인터 배열 아니다. 포인터 배열은 Vehicle* vehicles[N]과 같이 정의됩니다.

내가 수동으로 (내가 배열에있는 항목을 알고) 배열을 반복하고 차량

예에 모든 포인터를 삭제합니까! 당신은 당신의 코드가 메모리 누설을 원하지 않습니까?

부스트 라이브러리에서 Boost::scoped_ptr을 사용하는 것이 좋습니다. 또한 컴파일러가 C++ 0x를 지원한다면 std::unique_ptr

+0

이것은 나의 교수가 운동에서 그것을 설명하는 방법이다. * 솔직히, 나는 또한 그것이'Vehicle * vehicles [n]'이라고 생각했다. – Aerus