문제

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"는 여전히 그것을 가리킬 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top