我想知道最好的方法是清除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
是否需要单独清除?
答案 0 :(得分:2)
指针就像纸张上面列有位置。
悬空指针是一个不存在的房子的地址。
当你所拥有的房子的唯一记录在一张特定的纸上时,会发生内存泄漏,并且你会破坏它并失去对房屋的追踪。
一个悬垂的指针是不整洁和危险的,如果有人跟着它发生坏事,但它不是一个直接的错误。即使泄漏也不是一个直接的错误。
一个独特的ptr对象是相同的地址 - 相同的写作 - 但写在魔法宝石上。当宝石被摧毁时,房屋也会被毁坏。
这使得在不泄漏唯一ptr的情况下泄漏资源变得困难。并且因为资源的所有者是明确的 - 这是唯一的ptr - 它使得这个独特的ptr不太可能悬挂,因为每个人都应该知道通过破坏独特的ptr来清理资源(破坏房屋)(粉碎)宝石)。
因此清除人/动物载体会破坏独特的ptrs(宝石),这会自动摧毁房屋(人和动物)。
指向矢量矢量仍然存在,但充满了悬空指针。然后清除它成为一个好主意。但它没有立即造成的伤害。在之前或之后清除它对人或动物的生命没有影响,因为它只是一组说明动物在结构化表格中的位置。