부스트 :: shared_ptr 표준 컨테이너
-
02-07-2019 - |
문제
foo 클래스가 있다고 가정하고 std ::지도를 사용하여 일부 부스트를 저장하고 싶다 :: shared_ptrs, eg :
class foo;
typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;
foo_sp_map m;
지도에 새 foo_sp를 추가하지만 이미 사용 된 키가 이미 존재하면 기존 항목이 삭제됩니까? 예를 들어:
foo_sp_map m;
void func1()
{
foo_sp p(new foo);
m[0] = p;
}
void func2()
{
foo_sp p2(new foo);
m[0] = p2;
}
원래 포인터 (P)가 P2로 대체 될 때 해방됩니까? 나는 그것이 될 것이라고 확신하지만, 나는 그것이 묻거나 공유 할 가치가 있다고 생각했다.
해결책
먼저, 질문 제목은 boost :: auto_ptr이라고 말하지만 실제로는 boost를 의미합니다 :: shared_ptr
그렇습니다. 원래 포인터가 해방됩니다 (더 이상 공유 된 참조가없는 경우).
다른 팁
그것은 당신의 ... 섹션에서 무슨 일이 일어나는지에 달려 있습니다
컨테이너 클래스에 포함되어 있습니다 사본 실행할 때 foo_sp의 인스턴스 m[0] = p2;
의 사본 p
그것은 원래 그 장소에 있었다. 당시에는 삭제됩니다 다른 foo_sp가 참조하지 않는 경우.
두 번째 줄에 선언 된 사본이 foo_sp p(new foo);
여전히 주위에 메모리가 처리되지 않습니다. 모든 참조가 제거되면 항목이 삭제됩니다.
stackoverflow는 내가 댓글을 달 수 없기 때문에 대답하겠습니다. :/
나는 "p"가 범위를 벗어나지 않는 것을 보지 못하므로 물체가 지적한 것입니다. ~ 아니다 해방됩니다. "P"는 여전히 그것을 가리킬 것입니다.
제휴하지 않습니다 StackOverflow