2011-10-04 4 views
0

나는 작은 질문이있다 :동일한 포인터 가변 메모리 누수에 대한 복사 생성자의 반복 호출?

Foo *myFoo; 
myFoo = new Foo(anotherFoo);  // some deep copy of another object 
myFoo = new Foo(yetAnotherFoo); // another deep copy of yet another object 

이것은 메모리 누출인가? 그렇다면 어떻게 제대로 피할 수 있는가? 내 프로그램의 상황은 'myFoo'가 클래스 멤버이기 때문에 복사 된 객체가 수정되기 때문에 때때로 다른 객체의 전체 복사본에 대해 "유일 한"저장 객체로 사용하려고합니다. 나중에 비교를 위해 초기 객체가 필요함).

다음과 같은 간단한 해결 방법을 시도했습니다.

// within a class method of the same class 
if (myFoo!=NULL) delete myFoo; 
myFoo = new Foo(fooToStore); 

이 프로그램은 소멸자가 호출되자 마자 충돌합니다. 내 (평범하지 않은) 소멸자가 약간 버그가 있는지 (여기에서 논의 할 다른 문제) 또는 클래스 메소드 내에서 삭제를 통해 클래스 멤버 객체를 삭제하는 것이 일반적으로 금지되는지 확실하지 않습니다.

시간과 도움을 많이 주셔서 감사합니다 - 감사합니다!

을 표시하십시오.
+0

Sidenote : 삭제를 호출하기 전에 myFoo가 NULL인지 확인해야하며, 삭제는 NULL 값을 올바르게 처리합니다. – larsmoa

답변

2

예, 이는 메모리 누수입니다. myFoo으로 두 번째 할당하면 처음 액세스 할 수 없도록 할당 된 Foo이됩니다. 연속적인 할당간에 myFoo을 삭제하는 것은 올바른 일입니다. 널 포인터를 검사 할 필요가 없음을 유의하십시오. delete이 처리합니다. Foo의 소멸자에 문제가있는 것 같습니다.

+0

... 소멸자가 초기화되지 않은 멤버 포인터의 삭제를 수행하는 경우에도 생성자가 될 수 있습니다. –

+0

도움 주셔서 감사합니다! 생성자와 소멸자를 자세히 살펴볼 것입니다. 안부, 마크 – Mark

4

포인터를 다시 할당하기 전에 new 식의 결과를 삭제하지 않으면 반드시 메모리 누수가 발생합니다. explicit-delete 솔루션이 제대로 작동해야하지만 실제로 원하는 것은 스마트 포인터 유형 멤버입니다. a scoped_ptr<Foo>.

마 법적으로 소멸자 문제를 해결할 수도 있습니다.

0

"하지만이 소멸자가 호출되는 즉시 내 프로그램이 충돌"기본 클래스 소멸자가 'myFoo'delete 호출하는 것을 의미합니다 가정합니다.

메인 클래스 생성자에서 'myFoo'를 초기화하는 것을 잊지 마세요. 'myFoo'인스턴스가 생성되지 않으면 메인 클래스 소멸자에서 충돌을 방지합니다.