2011-11-18 1 views
0

는 전용 멤버 변수 name 및 기본 생성자와 C++에서 간단한 클래스를 감안할 때 :생성자의 초기화 목록에 new 연산자가있는 memleak이 필요한 이유는 무엇입니까?

#include <QString> 

class Testclass 
{ 
    private: 
    QString *name; 

    public: 
    Testclass(): name(new QString()) {} 
}; 

왜 Valgrind의의 memcheck이 생성자를 사용하면 확실히 손실 1 개 블록의 8 바이트를, 불평합니까?

+3

동적으로'name'을 할당 할 때 요점은 무엇입니까? –

+0

소멸자가 있습니까? –

+0

개체를 만들 때 또는 포인터를 다시 할당 할 때 (첫 번째 포인터를 '삭제'하지 않고) 누수가 있습니까? –

답변

5
~Testclass(){delete name;} 

누출을 연결합니다. C++은 이것을하지 않습니다.

ETA : ildjarn은 복사 생성자와 할당 연산자도 있어야한다고 올바르게 지적합니다.

TestClass(const TestClass &cp): name(new QString(*(cp.name))) {} 
const TestClass& operator=(const Testclass&rhs) 
{ 
    (*name)=(*hrs.name); 
    return *this; 
} 

그렇지 않으면 기본 복사 생성자 또는 할당 연산자가 동일한 메모리를 두 번 삭제합니다. 소멸자가 필요한 대부분의 클래스는 기본 복사 생성자 및 할당 연산자를 바꾸거나 비활성화해야합니다. 이를 "규칙 3"라고합니다.

QString을 std :: string 또는 std :: vector와 같은 가벼운 컨테이너 클래스 일 가능성이 있으므로 값으로 QString을 사용하는 것이 좋습니다. 그러나 C++ 초보자라면 한 번이 방법을 사용하는 것이 중요한 교훈입니다.

+6

물론 그는 소멸자 외에도 복사 생성자와 복사 할당 연산자가 필요합니다. [규칙 3] (http://en.wikipedia.org/wiki/Rule_of_three_ (C % 2B % 2B_programming)) – ildjarn