2010-08-14 2 views
2

내가 클래스의 Boda 있다고 가정하자 :C++에서 클래스 포인터로 클래스 포인터에 스마트 포인터를 넣는 올바른 방법은 무엇입니까?

class Boda { 
    ... 
}; 

그리고 내가 스마트 포인터를 (즉, I 클래스가수록이 즉시 자동으로 할당 해제 할 수하고자하는이 클래스의 구성원 cydo이 의해 파괴됨).

나는 부스트의 스마트 포인터를 사용하고, 그래서 쓰기 :

class Boda { 
    boost::shared_ptr<int> cydo; 
    public: 
     Boda() { 
      cydo = boost::shared_ptr<int>(new int(5)); 
     } 
}; 

이 반원으로 스마트 포인터 퍼팅의 올바른 사용인가?

감사합니다. Boda Cydo. 당신이 당신 자신에게 물어 봐야 int ... :)

+1

아시다시피, 더 짧은 코드는'cydo.reset (new int (5));'입니다. 하지만 어쨌든 초기화 목록을 선호하십시오. – GManNickG

답변

10
class Boda { 
    boost::shared_ptr<int> cydo; 
    public: 
     Boda() : cydo(new int(5)) {} 
}; 

비록, 난 당신이 별도로 멤버를 할당 할 필요가 있는지 생각하지 수 수업. 모든 포인터 유형을 저장하는 것과 비교하여 클래스에 멤버를 저장하는 것이 일반적으로 더 좋습니다. 만약 당신이 그것을 할 수 없다면, 예를 들어 컨테이너가 생성되기 전후에 멤버의 수명이 시작되면 멤버의 소유권을 넘어 확장되어 다른 오브젝트에 양보 될 수 있고 포인터를 사용해야합니다.

포인터를 사용해야하는 경우 원시 포인터에 대한 스마트 포인터를 선호하고 요구 사항에 따라 특정 유형을 선택해야합니다. 멤버 소유권이 다른 객체와 공유되지 않지만 포함 된 객체의 수명이 컨테이너 전후로 시작될 수 있거나 소유권을 다른 객체로 이전 할 수 있기 때문에 포인터를 사용해야하는 경우 자원 (양도하지 않은 경우)은 컨테이너의 전적인 책임이므로 unique_ptr 또는 auto_ptr을 선호합니다.

포함 된 개체가이 클래스에만 속하지 않는 경우 shared_ptr을 사용하십시오. 이것은 구성원이 다른 스레드에 의해 사용되는 경우에도 소유권이 스레드 중 하나에서만 보유되는 경우에도 각 스레드가 자신의 shared_ptr을 보유하고있는 상태에서 사용되며, 다른 스레드에서 오브젝트가 여전히 사용되고있을 때 한 스레드에서 오브젝트가 파손되지 않도록하기 위해 사용될 수도 있습니다 .

+0

죄송합니다. 나는 정말로 더 좋은 점이있다. :) – bodacydo

+4

항상 이니셜 라이저 목록을 사용하고 2) 복사 초기화가 아닌 직접 초기화를 사용하십시오. 중복 할당 및 사본을 피하십시오. Sutter : http://www.gotw.ca/gotw/036.htm을 참조하십시오. – dirkgently

2

진짜 문제를 래핑 싶어 왜

관련 문제