vector
의 vector
을 메모리 누수없이 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()
을 호출해도 괜찮습니까? 아니면 메모리 누수에 대해 걱정할 필요가 없습니까? 아니면 다른 두 가지보다 먼저 호출해야합니까?
vectors
animalOwnerships
을 개별적으로 삭제해야합니까?
나는 당신이 무엇을 요구하고 있는지 완전히 모릅니다. 'animalOwnerships' 또는'animals' 중 어느 것이 먼저 파괴 될지 확실하지 않다면'shared_ptr'과 공유 소유권이 필요합니까? 그것들이 (거의) 같은 시간에 지워지는 경우, 당신이 지우는 순서에 상관 없습니다. 매달려있는 포인터의 벡터를 '지우는'것은 좋습니다. 어떤 사람들은 먼저'animalOwnerships '을 정리하는 것이 쉽지 않다는 것을 알고있을 것입니다. –
@ FrançoisAndrieux 일반적으로 '동물'은 영구적입니다. 이 "벡터들"을 "재설정"할 유일한 시나리오가 있으며, 나는 그것을하는 순서에 대해 완전한 통제권을가집니다. 이것을 감안할 때'animals.clear() '앞에'animalOwnerships.clear()'를 호출해야합니까? 둘 다 연속적으로 정리하면 정말 중요합니까? 'animals.clear()'를 먼저 호출하면 무슨 일이 일어나는지 (포인터와 메모리 측면에서) 궁금합니다. – PhysicsCodingEnthusiast
'animals'을 지우면, 그 안에 들어있는'unique_ptr'을 파기합니다. 이것은 차례로 각 Animal 인스턴스를 가리 킵니다. 이 시점에서'animalOwnerships'는 변경되지 않지만 포인터는 모두 유효하지 않습니다 (매달림). 당신은 여전히 그 포인터들을 파괴 할 수 있습니다 (그것들을'delete '에주는 것과 혼동해서는 안됩니다). 그래서'animalOwnerships'을'clear'하는 것이 문제가 아닙니다. –