2016-09-05 5 views
-1

나는 다음과 같이 클래스 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의 삭제에 문제가 될 것이라고 생각합니다. 그게 어때?

이러한 승인의 결함은 무엇입니까? 올바른 접근 방식으로 동일한 "기능"(포인터 멤버 변수를 올바르게 설정)에 어떻게 도달 할 수 있습니까?

+3

http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three –

+1

실제로 문제가 있습니다. 첫째,'CHelper' 객체가 파괴되면'_c' 멤버도 파괴됩니다. '_pc'는 쓰레기를 가리 킵니다. 둘째,'delete _pc; '는 같은 객체에 대해 두 번째 파괴를 시도합니다. 나는 std smart pointer를 살펴보기를 제안한다. –

+0

예제가 컴파일되지 않습니다. 'L' 클래스 안에서 소멸자의 이름은'~ C'입니다. 그건 작동하지 않습니다. 또한 클래스의 생성시에'_pc'을 nullptr로 초기화해야합니다. 대안으로'shared_ptr' 또는'unique_ptr'와 같은 스마트 포인터를 고려할 수 있습니다. – Hayt

답변

0

코드가 현재 컴파일되지 않습니다. CHelper의 생성자가 C 개체를 요청합니다. C 클래스 (아마도)에는 setc 메서드가 없습니다. 아마도 CHelper(L& ic)을 의미했을 것입니다.

어쨌든 CHelper 객체가 범위를 벗어나 파괴되면 멤버 변수 _c이 파괴됩니다. 당신의 L 개체에 매달려있는 포인터를 남겨주세요. 그뿐 아니라 L도 현재 3/5의 규칙을 위반합니다. 당신이 C++ (11)에 액세스 할 수있는 경우 CHelper 클래스가 필요하다 (따라서 그 소멸자에서 delete 제거)하고 그렇지 않으면 std::unique_ptr을 경우

나는 크게 std::shared_ptr와 원시 포인터 _pc_c를 교체하는 것이 좋습니다 것입니다.

+0

맞았습니다. 코드를 수정했습니다. '_c'은 포인터가 아닙니다. –

+0

@ user10000100_u하지만 공유 된 ptr 관리를 위해서는 반드시 필요합니다. –

-3

어레이에 delete [] _pc를 사용해야하므로 ipc 매개 변수가 배열처럼 할당되는지 확인하십시오.