清除指向唯一指针所拥有的对象的原始指针向量

时间:2017-12-20 20:47:30

标签: c++ c++11 pointers vector smart-pointers

我想知道最好的方法是清除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()而不需要担心任何内存泄漏,或者是否应该先调用其他两个?

另外,vectors中的个人animalOwnerships是否需要单独清除?

1 个答案:

答案 0 :(得分:2)

指针就像纸张上面列有位置。

悬空指针是一个不存在的房子的地址。

当你所拥有的房子的唯一记录在一张特定的纸上时,会发生内存泄漏,并且你会破坏它并失去对房屋的追踪。

一个悬垂的指针是不整洁和危险的,如果有人跟着它发生坏事,但它不是一个直接的错误。即使泄漏也不是一个直接的错误。

一个独特的ptr对象是相同的地址 - 相同的写作 - 但写在魔法宝石上。当宝石被摧毁时,房屋也会被毁坏。

这使得在不泄漏唯一ptr的情况下泄漏资源变得困难。并且因为资源的所有者是明确的 - 这是唯一的ptr - 它使得这个独特的ptr不太可能悬挂,因为每个人都应该知道通过破坏独特的ptr来清理资源(破坏房屋)(粉碎)宝石)。

因此清除人/动物载体会破坏独特的ptrs(宝石),这会自动摧毁房屋(人和动物)。

指向矢量矢量仍然存在,但充满了悬空指针。然后清除它成为一个好主意。但它没有立即造成的伤害。在之前或之后清除它对人或动物的生命没有影响,因为它只是一组说明动物在结构化表格中的位置。