【发布时间】:2018-06-03 11:48:01
【问题描述】:
我想知道最好的方法是清除vector 中的vectors 的原始指针,这些指针指向unique_ptrs 拥有的对象,而不会出现任何内存泄漏。
为了更具体,假设我有:
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是否需要单独清除?
【问题讨论】:
-
我不完全确定你在问什么。如果您不确定
animalOwnerships或animals中的哪一个将首先被销毁,也许您需要与shared_ptr共享所有权?如果它们(几乎)同时被清除,那么清除它们的顺序并不重要。clear一个悬空指针向量很好。有些人可能会欣赏先清除animalOwnerships的整洁。 -
@FrançoisAndrieux 通常,
animals是永久性的。只有一个场景我会“重置”这些vectors,并且我可以完全控制我这样做的顺序。鉴于此,我应该在animals.clear()之前调用animalOwnerships.clear()吗?如果我连续清除它们真的很重要吗?如果我先打电话给animals.clear(),我会对正在发生的事情(在指针和内存方面)更好奇。 -
当您清除
animals时,您将销毁其中包含的每个unique_ptr。这反过来又指向delete每个指向Animal的实例。此时,animalOwnerships没有改变,但它的指针都是无效的(悬空)。您仍然可以销毁这些指针(不要与将它们交给delete混淆)所以clearanimalOwnerships不是问题。 -
@FrançoisAndrieux 谢谢你的解释。另外,为了确保我理解,可以先
clearanimalOwnerships,因为animalOwnerships中的原始指针指向的Animal对象/实例归unique_ptrs 所有。相反,如果这些对象没有nounique_ptrs,然后我调用了animalOwnerships.clear(),那么我就会发生内存泄漏,因为我会删除指向这些对象的唯一指针在记忆中。但是,感谢unique_ptrs,我不必再担心这个了。对吗? -
对。如果您只有原始指针,则在清除最后一个向量之前,您需要自己
deleteAnimal实例。
标签: c++ c++11 pointers vector smart-pointers