나는 다음과 같이 클래스 L
단순화 있습니다 C
가 다른 클래스입니다포인터 멤버 변수를 설정하면 제대로
class L
{
private:
C * _pc ;
public:
C * getc() const ; // getter
void setc(const C * ipc); //setter
~L()
{
delete _pc ;
}
};
.
는 또한 다음과 같이 헬퍼 클래스 CHelper
단순화 있습니다
class CHelper
{
C _c ;
CHelper(L & ic)
{
// 1st constructs _c (code omitted);
// then sets ic's _pc pointer member variable :
ic.setc(&_c);
}
};
확실하지 않고, 어떻게 든 _pc
의 삭제에 문제가 될 것이라고 생각합니다. 그게 어때?
이러한 승인의 결함은 무엇입니까? 올바른 접근 방식으로 동일한 "기능"(포인터 멤버 변수를 올바르게 설정)에 어떻게 도달 할 수 있습니까?
http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three –
실제로 문제가 있습니다. 첫째,'CHelper' 객체가 파괴되면'_c' 멤버도 파괴됩니다. '_pc'는 쓰레기를 가리 킵니다. 둘째,'delete _pc; '는 같은 객체에 대해 두 번째 파괴를 시도합니다. 나는 std smart pointer를 살펴보기를 제안한다. –
예제가 컴파일되지 않습니다. 'L' 클래스 안에서 소멸자의 이름은'~ C'입니다. 그건 작동하지 않습니다. 또한 클래스의 생성시에'_pc'을 nullptr로 초기화해야합니다. 대안으로'shared_ptr' 또는'unique_ptr'와 같은 스마트 포인터를 고려할 수 있습니다. – Hayt