답변
예 여기에서있다 :
#include <boost/serialization/shared_ptr.hpp> // for null_deleter
class Foo
{
int x;
};
Foo foo;
boost::shared_ptr<Foo> sharedfoo(&foo, boost::serialization::null_deleter());
있다, 물론, 그것으로 당신이 나중에 사용하기 위해 shared_ptr을 저장하지 않습니다 전화 기능을 알 필요가 있다는 사실에 위험이 사실을 기본 객체가 shared_ptr의 마지막 인스턴스까지 유효하다는 점에서 shared_ptr의 정책을 위반합니다.
보이는 것처럼 가까이 있습니다. –
deallocator가 호출되지 않도록 여분의 참조를받는 것이 더 깔끔하지 않을까요? (여전히 깨끗한 것은 아니지만).
Boost에는 작업을 수행 할 수있는 기능이 없다고 말할 수는 없지만 포함시키려는 것처럼 들리는 것은 아닙니다.
편집
:는 의견과 약간의 문서를 읽으면서,이 귀결 :참조 누출. 어떤 시점에서 다음을 실행하십시오.
new shared_ptr(my_global_shared_ptr);
장점 : 개념 상 쉽습니다. 단점 : 힙에서 뭔가를 누출하고 있습니다.
맞춤 해제 기.
shared_ptr
은 deallocator 함수가 거의 필요 없기 때문에 다른 대답에서 제공된 것과 같은 익명 ID 함수가 정상적으로 작동합니다.장점 : 부스트를 활용하고 절대적으로 오버 헤드가 없습니다. 단점 : 약간의 문서가 필요합니다.
비 정적 전역 개체입니다. 개체에 대한 글로벌
shared_ptr
이있는 경우 해당 개체에 대한 유일한 액세스 수단이어야합니다. 전역 선언을 으로 초기화 된shared_ptr
으로 바꿉니다. 나는 이것이 최고라고 생각한다. ':: _ 1 람다 :: 향상'#include <boost/shared_ptr.hpp> #include <boost/lambda/lambda.hpp> int main() { int *p = new int(5); { boost::shared_ptr<int> sp(p, boost::lambda::_1); } delete p; }
하나 개의 인자를 빈 펑를 만듭니다
추가 참조 자료는 어떻게 작성합니까? 나는'shared_ptr' 수에 접근 할 수 있다고 생각하지 않았습니다. –
@ 마크 랜섬 : 나는 그가'shared_ptr'을 복사하고 어딘가에 저장하는 것을 의미한다고 생각합니다. –
그래,하지만 여분의 복사본은 결국 파괴 될거야. 실용적이지 않습니다. –
솔루션 Boost.Lambda를 사용합니다.
사람들이 왜 그랬는지 알 수 있도록 // 거기에 댓글을 달아보십시오.
* "내 코드를 뿌리기 싫어"* 카테고리에 해당됩니다. –
이 솔루션은 boost :: lambda :: _ 1 대신 가상의 boost :: no_op_deallocator()를 사용하는 것보다 더 뿌리 는가? – scjohnno
아주 똑똑한 해결책이지만, 나는 어딘가에 사소한 기능을 갖고 그것을 설명하는 이름을 부여하고 싶다고 생각한다. –
부스트 버그 추적기에 대한 티켓이 있습니다. https://svn.boost.org/trac/boost/ticket/1913 - 2 주 전의 중얼 거림 때까지 오랫동안 활동하지 않았습니다.
FWIW, 여기 내가 사용하고있는 것. 로컬 테스트를 단위 테스트에서 사용하여 shared_ptr에 로컬을 적용합니다.
// The class NoOp_sptr_Deleter can be used to construct a shared_ptr<>()
// that will NOT delete the pointee.
// This can be helpful in unit-testing. Wrapping a local as a shared_ptr.
// Do take care with the lifetimes though.
struct NoOp_sptr_Deleter
{
void operator()(void const *) const {}
};
template<typename T>
boost::shared_ptr<T> FakeSharedPtrFromRef(T& aRef)
{
return boost::shared_ptr<T>(&aRef, NoOp_sptr_Deleter());
}
OP는 Boost 또는 stdlib에서 이미 제공 한 솔루션을 요청했습니다. 그는 그러한 함수/펑터를 작성하는 것이 매우 간단하다는 것을 알고 있습니다. – Xeo
- 부스트
<=
1합니다.54의 경우boost/log/utility/empty_deleter.hpp
을 사용하십시오. - 부스트
==
1.55 인 경우boost/utility/empty_deleter.hpp
을 사용하십시오. - 부스트
>=
1.56 인 경우boost/core/null_deleter.hpp
을 사용하십시오.
- 1. 당기 파이썬 모듈까지
- 2. 의욕적 인 클론/당기 거부?
- 3. 분할에서 가능한 조합의 수
- 4. 가능한 조합의 수를 결정하십시오.
- 5. 부스트 파이썬과 shared_ptr의 벡터
- 6. shared_ptr의 적절한 사용?
- 7. 기본값 : 클래스 생성자에 shared_ptr의
- 8. 부스트 :: shared_ptr의 의미 (복사)
- 9. 부스트 :: shared_ptr의 표준 컨테이너
- 10. shared_ptr의 어설의 픽셀 = 0
- 11. 컨테이너에 대한 shared_ptr의 의미는 무엇입니까?
- 12. boost :: ~ shared_ptr의 작동 방식은 무엇입니까?
- 13. 주요 HTML 및 CSS 스키닝 조합의 장단점
- 14. 일부 바로 가기 조합의 역사적인 기원
- 15. 하여 표준 : 설정 <shared_ptr의 <T>>에서 제거 shared_ptr의 <const T>
- 16. 에는 GDIPlus :: 이미지 개체 및 부스트 : : shared_ptr의
- 17. shared_ptr의 컨테이너에서 C++ std :: equal을 사용합니다.
- 18. 다음과 같이 C++ shared_ptr의 평등 연산자는
- 19. ASP.NET Active Directory 역할 - 겹치는 역할 관리
- 20. 당기 <identity> 문자열 내 Web.Config 파일에서
- 21. C# 일반 및 특정 확장 메서드 조합의 모호성
- 22. 인터페이스의 속성 및 개인 및 확장 된 클래스 조합의 혼동
- 23. 제네릭 조합의 개념을 새로운 유형으로 캡슐화하는 방법은 무엇입니까?
- 24. asp.net 웹 응용 프로그램 조합의 웹 서비스 레이어
- 25. 모든 가능한 값 조합의 배열로 배열을 결합하는 단일 라이너 알고리즘?
- 26. Linq2Sql로 모든 사용자와 역할 (멤버십 및 역할)을 얻으시겠습니까?
- 27. SSAS 역할 - 큐브에 대한 액세스를 제한하는 역할 만들기 (국가 별)
- 28. ASP.NET 역할 기반 보안이 실제 역할 기반 액세스 제어 시스템입니까?
- 29. 역할 할당 : 다른 역할, 경우에 따라 동일 권한
- 30. ASP.net 멤버쉽 - 역할 추가
개체를 파괴 할 필요가없는 경우 왜 처음에 shared_ptr에 넣는 것입니까? –
스마트 포인터를 사방에 놓고 'shared_ptr'이 필요한 함수에 스택 또는 멤버 변수를 전달하려는 경우 매우 편리합니다. –
@ 마크 랜섬 (Mark Ransom) : 당신은 제가 저주를 들게하는 코드베이스를 생각하게 만듭니다. : P –