清除指向由唯一指针拥有的对象的原始指针向量
Clearing a vector of raw pointers to objects owned by unique pointers
我想知道最好的方法是清除 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()
,这将删除指向 class 对象的唯一指针,这反过来又会删除 class 对象本身(这里说错了请指正)
如果我先调用这些,那么 animalOwnerships
是否由悬挂指针组成?此时可以调用 animalOwnerships.clear()
而不必担心任何内存泄漏,还是应该先调用它,然后再调用其他两个?
另外,animalOwnerships
中的个体vectors
需要单独清除吗?
指针就像一张纸,上面列出了位置。
悬挂指针是指向不存在的房屋的地址。
当您对房子的唯一记录是在一张特定的纸上时,就会发生内存泄漏,而您破坏了它并失去了对房子的追踪。
悬挂指针不整洁且有风险,因为如果有人跟随它,就会发生坏事,但这不是一个直接的错误。即使泄漏也不是直接的错误。
唯一的 ptr 对象是相同的地址——相同的写法——但写在魔法 gem 上。当gem被摧毁时,房子也被摧毁。
这使得在不泄漏唯一 ptr 的情况下很难泄漏资源。而且因为资源的所有者是明确的——它是唯一的 ptr——它使得唯一的 ptr 不太可能悬空,因为每个人都应该知道只有通过销毁唯一的 ptr(粉碎)来清理资源(摧毁房子) gem).
所以清除 people/animal 向量会破坏唯一的点(gems),这会自动破坏房屋(人和动物)。
指针向量的向量仍然存在,但充满了悬空指针。然后清除它成为一个好主意。但它的存在不会立即造成伤害。之前或之后清除它对人或动物的寿命没有影响,因为它只是一组注释,说明动物在结构化 table.
中的位置。
我想知道最好的方法是清除 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()
,这将删除指向 class 对象的唯一指针,这反过来又会删除 class 对象本身(这里说错了请指正)
如果我先调用这些,那么 animalOwnerships
是否由悬挂指针组成?此时可以调用 animalOwnerships.clear()
而不必担心任何内存泄漏,还是应该先调用它,然后再调用其他两个?
另外,animalOwnerships
中的个体vectors
需要单独清除吗?
指针就像一张纸,上面列出了位置。
悬挂指针是指向不存在的房屋的地址。
当您对房子的唯一记录是在一张特定的纸上时,就会发生内存泄漏,而您破坏了它并失去了对房子的追踪。
悬挂指针不整洁且有风险,因为如果有人跟随它,就会发生坏事,但这不是一个直接的错误。即使泄漏也不是直接的错误。
唯一的 ptr 对象是相同的地址——相同的写法——但写在魔法 gem 上。当gem被摧毁时,房子也被摧毁。
这使得在不泄漏唯一 ptr 的情况下很难泄漏资源。而且因为资源的所有者是明确的——它是唯一的 ptr——它使得唯一的 ptr 不太可能悬空,因为每个人都应该知道只有通过销毁唯一的 ptr(粉碎)来清理资源(摧毁房子) gem).
所以清除 people/animal 向量会破坏唯一的点(gems),这会自动破坏房屋(人和动物)。
指针向量的向量仍然存在,但充满了悬空指针。然后清除它成为一个好主意。但它的存在不会立即造成伤害。之前或之后清除它对人或动物的寿命没有影响,因为它只是一组注释,说明动物在结构化 table.
中的位置。