2013-10-25 3 views
-1

나는 문제가 있으며 그 원인을 알고 있다고 확신합니다. 나는 약간의 설명을 원할 뿐이다. 다른 클래스를 포함하는 클래스가 있지만 단순화를 위해 예제를 두 클래스로 제한합니다.C++에서 소멸자와 범위에 대한 설명이 필요합니다.

클래스 A는 클래스 B를 포함합니다. 클래스 A의 생성자에서 B의 생성자를 호출하여 클래스 B를 초기화합니다. 클래스 A의 생성자 끝에서 클래스 B의 소멸자가 호출됩니다. 이는 예상했던 동작이 아닙니다. 다음은 그 예 ...

아의

#include "b.h" 

class a { 
    public: 
     b classB; 

     a(int someParam); 
}; 

a.cpp

#include "a.h" 

//Class A's constructor 
a::a(int someParam) { 
    //Set class B by calling it's constructor 
    classB = b(someParam); 
    //Now class B's destructor gets called when exiting A's constructor... 
} 

난 당신이 "새로운"사용하지 않고 변수를 선언하는 경우는 현재를 떠날 때, 그것은 파괴됩니다 것을 알고있다 범위. 그러나 저는 항상 변수의 범위에 적용하고 값을 할당하는 범위가 아닌 것으로 생각했습니다. 그 입니다. 맞습니까? 그렇다면 classB = *new b(someParam);이 거기에 아무런 문제가없는 것입니까? 아니면 그냥 대신 포인터를 사용해야합니까? 이 라인

+0

좋은 C++ 프로그래밍 안내서를 읽으십시오. 'classB = * new b (someParam);'는'new b '에 의해 생성 된 객체를 복사하고 있기 때문에 (메모리 누수가 생기기 때문에). –

+0

@BasileStarynkevitch 알겠습니다. 감사합니다 –

답변

3

:

classB = b(someParam); 

발현 b(someParam) 그러면 부재 객체 classB에 asssigned되는 임시 무명 b 객체를 생성한다. 소위 멤버 개체의 소멸자가 아니라이 무명 임시의 소멸자입니다. 당신은, 적절한 생성자와 구성원 개체를 초기화하는 대신 직접이 임시의 생성을 방지하고, 원하는 초기화 목록을 사용하는 경우 :

a::a(int someParam) 
    :classB(someParam) 
{} 

그리고이 :

classB = *new b(someParam); 

인스턴트 메모리 누수입니다. 당신은 무료 저장소에 객체를 할당하고 그것에 할당 된 객체를 classB에 복사하고 포인터를 잃어 버리고 있습니다.

+0

OP는'classB = * new b (someParam);에 대해 묻습니다 ... ... –

+0

@BasileStarynkevitch : 문제의 원인에 대한 OP의 가정에 근거한 종속 조항이었습니다. OP에 대한 가정은 잘못되었습니다. 하지만 메모를 추가하겠습니다. –

+0

이제 알겠습니다. 나는 초기화 목록에 대해 알지 못했기 때문에 포인터를 사용하기로 전환하려고했다. 고맙습니다. –

관련 문제