2017-12-20 16 views
1

vectorvector을 메모리 누수없이 unique_ptr이 소유 한 객체를 가리키는 원시 포인터로 지우는 것이 가장 좋은 방법인지 궁금합니다.고유 포인터가 소유 한 객체에 대한 원시 포인터 벡터를 지우는 중

std::vector<std::unique_ptr<Person>> people; 
std::vector<std::unique_ptr<Animal>> animals; 
std::vector<std::vector<Animal*>> animalOwnerships; 

을 내가 다시 클래스 객체를 삭제하는 클래스 객체에 고유의 포인터를 삭제하는 people.clear()animals.clear()을 사용할 수 있습니다 알고

내가 가지고 가정이보다 구체적인를 만들려면 그들 자신 (내가 여기 오해하는 경우에 나를 교정하십시오).

내가 먼저 부르면 animalOwnerships은 포인터가 매달려 있습니까? 이 시점에서 animalOwnerships.clear()을 호출해도 괜찮습니까? 아니면 메모리 누수에 대해 걱정할 필요가 없습니까? 아니면 다른 두 가지보다 먼저 호출해야합니까?

vectorsanimalOwnerships을 개별적으로 삭제해야합니까?

+0

나는 당신이 무엇을 요구하고 있는지 완전히 모릅니다. 'animalOwnerships' 또는'animals' 중 어느 것이 먼저 파괴 될지 확실하지 않다면'shared_ptr'과 공유 소유권이 필요합니까? 그것들이 (거의) 같은 시간에 지워지는 경우, 당신이 지우는 순서에 상관 없습니다. 매달려있는 포인터의 벡터를 '지우는'것은 좋습니다. 어떤 사람들은 먼저'animalOwnerships '을 정리하는 것이 쉽지 않다는 것을 알고있을 것입니다. –

+0

@ FrançoisAndrieux 일반적으로 '동물'은 영구적입니다. 이 "벡터들"을 "재설정"할 유일한 시나리오가 있으며, 나는 그것을하는 순서에 대해 완전한 통제권을가집니다. 이것을 감안할 때'animals.clear() '앞에'animalOwnerships.clear()'를 호출해야합니까? 둘 다 연속적으로 정리하면 정말 중요합니까? 'animals.clear()'를 먼저 호출하면 무슨 일이 일어나는지 (포인터와 메모리 측면에서) 궁금합니다. – PhysicsCodingEnthusiast

+3

'animals'을 지우면, 그 안에 들어있는'unique_ptr'을 파기합니다. 이것은 차례로 각 Animal 인스턴스를 가리 킵니다. 이 시점에서'animalOwnerships'는 변경되지 않지만 포인터는 모두 유효하지 않습니다 (매달림). 당신은 여전히 ​​그 포인터들을 파괴 할 수 있습니다 (그것들을'delete '에주는 것과 혼동해서는 안됩니다). 그래서'animalOwnerships'을'clear'하는 것이 문제가 아닙니다. –

답변

2

포인터는 위치가 나열된 종이 조각과 같습니다.

매달린 포인터는 존재하지 않는 집에 대한 주소입니다.

집이있는 특정 기록이 특정 종이에있는 경우 메모리 누수가 발생하고이를 파괴하고 집을 추적하지 못할 수 있습니다.

매달려있는 포인터는 누구나 따라 다니는 것이 나쁜 일이지만, 즉각적인 버그는 아닙니다. 누출조차도 즉각적인 버그는 아닙니다.

고유 한 ptr 개체는 동일한 주소인데 동일한 글을 쓰지만 마법의 보석으로 작성되었습니다. 보석이 파괴되면 집도 파괴됩니다.

이렇게하면 고유 한 ptr을 유출하지 않고 리소스를 유출하기가 어렵습니다. 그리고 자원의 소유자가 분명하기 때문에 - 그것은 고유 한 ptr입니다 - 모든 ptr을 파괴하여 자원을 정리해야한다는 것을 알고 있어야하므로 고유 한 ptr을 매달릴 가능성이 적습니다 (shattering 보석).

그래서 사람들/동물 벡터를 제거하면 자동으로 주택 (사람과 동물)을 파괴하는 고유 한 ptrs (보석)가 파괴됩니다.

포인터 벡터 벡터는 남아 있지만 매달 리 포인터로 가득 차 있습니다. 그런 다음이를 지우는 것이 좋습니다. 그러나 그로부터 즉각적인 해가 없다. 그것이 동물이 구조화 된 테이블에있는 곳을 말하는 메모의 집합이기 때문에, 그것을 지우기 전이나 후에, 사람이나 동물의 일생에 아무런 영향을 미치지 않습니다.

+0

나는 동화책을 읽고있는 것처럼 느껴졌는데, 마술 같은 보석들과 함께 무엇을! 하지만 매우 명확하게 명시된 - 감사합니다! – PhysicsCodingEnthusiast