가상 함수가있는 힙 할당 객체를 저장할 수있는 컬렉션이 필요합니다.참조 카운팅을 사용하는 C++ 포인터 컨테이너
약 boost::shared_ptr
, std::unique_ptr
(C++ 11) 및 boost::ptr_(vector|list|map)
으로 알려져 있지만 중복 포인터 문제는 해결되지 않습니다. - _list
두 개의 포인터를 포함합니다
void SomeClass::add(T* ptr)
{
_list.push_back(ptr);
}
내가 같은 매개 변수를 두 번 add
를 호출하지만 ptr
가 : -
_list
이 파괴되면 동일한 객체가 여러 번 삭제됩니다.
그가 저장하고 삭제 시간에 사용하는 포인터를 계산하면이 문제는 해결되고 개체는 여러 번 삭제되지 않습니다.
그래서 질문은 :
누군가와 포인터의 컬렉션 일부 라이브러리 (벡터,리스트, 본질적으로지도)를 알고 있는가 자동 삭제 파괴와 참조 카운팅의 지원에?
아니면 다른 기술을 사용하여이 문제를 해결할 수 있습니까?
업데이트 :
나는 중복 포인터의 지원이 필요합니다. 그래서 std::set
을 사용할 수 없습니다.
Kerrek SB 및 Grizzly으로 언급 한 - 일반적으로 원시 포인터를 사용하는 나쁜 생각과 std::make_shared
을 사용하고 new
를 통해 인스턴스화 잊어 제안합니다. 그러나 이것은 클라이언트 측 코드의 책임입니다. 제가 설계 한 클래스가 아닙니다. 내가
void SomeClass::add(std::shared_ptr<T> ptr)
{
_list.push_back(ptr);
}
누군가에게 add
서명 (물론 _list
용기)를 변경하더라도 (모르는 사람에 대한 std::make_shared
) 여전히를 작성할 수 있습니다
SomeClass instance;
T* ptr = new T();
instance.add(ptr);
instance.add(ptr);
을 그래서이 전체 아닙니다 솔루션을 기다리고 있지만 코드를 작성하는 경우에만 유용합니다.
업데이트 2 : 대안 용액
i는 (생성 된 복사 생성자 사용) clonning 알았다. - 통화 및 중복 포인터를 허용 (일부 기본 클래스 (인터페이스) 확장 클래스 R)
template <typename R>
void SomeClass::add(const R& ref)
{
_list.push_back(new R(ref));
}
이 가상 메서드를 허용 할 것이다 : 나는이처럼 내 add
기능을 변경할 수 있음을 의미한다. 그러나이 솔루션에는 복제에 대한 오버 헤드가 있습니다.
공유 포인터 저장 방법은 어떻습니까? 파괴되면 다른 하나는 여전히 유효합니다. 두 개체가 모두 파괴되었을 때만 (그리고 같은 개체에 다른 공유 포인터가 존재하지 않는 경우에만) 포인터가 가리키는 개체는 파괴됩니다. – cHao
두 개의'shared_ptr'을 같은 객체에 하나만 삭제하면 그 객체는 한번 파괴됩니다. 문제가 무엇인지 모르겠습니다. –
@BenVoigt : 두 개의 'shared_ptrs'중 하나가 다른 하나를 복사하여 생성 된 경우에만 작동합니다. 원시 포인터에서 두 가지를 모두 만들지는 않습니다. 추가 할 작업은 다음과 같습니다. – Grizzly