gpt4 book ai didi

c++ - 清除指向由唯一指针拥有的对象的原始指针 vector

转载 作者:行者123 更新时间:2023-11-30 03:26:52 26 4
gpt4 key购买 nike

我想知道最好的方法是清除 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() 而不必担心任何内存泄漏,还是应该先调用它,然后再调用其他两个?

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

最佳答案

指针就像一张纸,上面列出了位置。

悬挂指针是指向不存在的房屋的地址。

当您拥有的关于房子的唯一记录是在一张特定的纸上时,就会发生内存泄漏,而您破坏了它并失去了房子的踪迹。

悬挂指针不整洁且有风险,因为如果有人跟随它,就会发生坏事,但这不是一个直接的错误。即使泄漏也不是直接的错误。

唯一的 ptr 对象是相同的地址——相同的文字——但写在魔法 gem 上。当 gem 被摧毁时,房子也会被摧毁。

这使得在不泄漏唯一 ptr 的情况下很难泄漏资源。而且因为资源的所有者是明确的——它是唯一的 ptr——它使得唯一的 ptr 不太可能悬空,因为每个人都应该知道只有通过销毁唯一的 ptr(粉碎)来清理资源(摧毁房子) gem )。

因此清除人/动物 vector 会破坏独特的 ptrs( gem ),这会自动破坏房屋(人和动物)。

vector-of-vector-of-pointers 仍然存在,但充满了悬空指针。然后清除它成为一个好主意。但它的存在不会立即造成伤害。之前或之后清除它不会影响人或动物的生命周期,因为它只是一组注释,说明动物在结构化表格中的位置。

关于c++ - 清除指向由唯一指针拥有的对象的原始指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47914132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com