2010-03-15 3 views

답변

0

클래스를 클라이언트에 표시하려면 공유 포인터를 사용하지 마십시오. 그들은 객체를 만들고 그것의 삭제에 대한 책임이 있음을 알고 있습니다.

그런 다음 쉽게

myfavorite::api::shared_ptr<Class> object(Class::create()); 

또는

std::auto_ptr<Class> object(Class::create()); 
3

당신이 그것의 사본에 유지되지 않는 경우를 쓸 수 있지만 사용자가 뾰족한 - 투 - 객체가 delete를 사용하여 삭제할 값으로 std::auto_ptr을 반환 할 수 있습니다. 종속성을 추가하지 않으며 (auto_ptr이 표준의 일부 임) 객체가 delete이어야한다는 요구 사항을 인터페이스에 분명하게 전달합니다.

사용자가 원하는 경우 release 포인터를 사용하고 수동으로 작업하거나 공유 스마트 포인터 프레임 워크로 이동할 수 있습니다.

+1

+1 의미에 도움이되는 인터페이스의 중요성에 대한 답변을 깜빡하고 있습니다. 'auto_ptr'은 소유권 이전을 의미합니다. –

+0

auto_ptr은 악의적인데, 특히 부주의 한 방식으로 값을 전달할 때 ... boost :: scoped_ptr이이 점에서 훨씬 좋습니다. –

+2

@Alexandre C .:이 사용법에서'boost :: scoped_ptr'는 완전히 부적절합니다. 복사 할 수 없기 때문에 반환 값으로 사용할 수도 없습니다. 'std :: auto_ptr'는 전기 톱이 사악하지 않은 것과 같은 방식으로 사악하지 않습니다. 그냥 도구 일뿐입니다. 그들은 의도가 없습니다.저글링 체인 톱이 매우 위험하다는 이유만으로 나무를 베어내는 유용한 응용 프로그램이 없다는 의미는 아닙니다. 아마도 C++ 0x (예 : unique_ptr - 더 나은 인터페이스는 rvalue 참조에서만 가능하지만)에서 소유권 이전을 표현하는 더 나은 표준 방법이 있지만 적어도'std :: auto_ptr '은 여기에 있습니다. –

2

요소가 실제로 공유되어 있습니까? 즉, 생성 후에는 자신의 목적을 위해 객체에 포인터를 유지합니까 아니면 사용자 메모리 누출을 막기 위해이 작업을 수행하고 있습니까?

메모리가 실제로 공유되지 않는다면 shared_ptr을 사용하지 않을 것입니다. 반환 유형으로 shared_ptr을 사용하면 동적 할당과 스마트 포인터의 특정 구현을 모두 사용하지만 유형 및 더 적합한 다른 스마트 포인터 유형에 대한 스택 사용을 제한합니다.

실제로 전화가 누출되지 않도록하려면 (즉, 사용자가 함수를 호출하면 반환 된 메모리가 '어떻게 든'처리됩니다. std::auto_ptr 또는 boost::unique_ptr을 사용할 수 있습니다. (마지막 코드는 C++ 0x에서도 비표준 임) 두 가지 솔루션 모두 호출 코드가 스마트 포인터에서 포인터를 추출하고 메모리 관리에 다른 접근법을 사용할 수 있습니다 (어떤 경우에는 성가신 경우 라 할지라도).

struct type { 
    std::auto_ptr<type> create(); 
}; 
std::auto_ptr<type> ap = type::create(); 
std::shared_ptr<type> sp(type::create().release()); 
type::create(); // will not leak memory 
type *rp = type::create().release(); // user specifically requested a raw pointer! 
1

그래, 작동합니다. 그러나, 당신이 그것을 필요 확신합니까? 상황이 적절할 때 상황이 있지만 그렇게 할 때 실제로 옵션을 제한하고 있습니다. 사용자가 활용하고 싶어하는 스마트 포인터의 다른 형태가 있습니다. 그렇게하면 생성자를 숨길 때 옵션으로 스택 기반 할당을 제거하는 것은 아닙니다.

관련 문제