我有一个向量
std::vector<Object*> objects;
Run Code Online (Sandbox Code Playgroud)
如果找到对象,则删除该对象的方法:
void Remove(Object *o)
{
objects.erase(
std::remove_if(
objects.begin(), objects.end(),
[&o](Object *_object) {
if (o == _object)
{
delete _object;
return true;
}
return false;
}
),
objects.end()
);
}
Run Code Online (Sandbox Code Playgroud)
这安全吗?我不应该打电话吗delete?但后来会erase打电话delete给我吗?我有点困惑。这会使迭代器无效或泄漏内存吗?
这会使迭代器无效或泄漏内存吗?
内存不会因个别代码而泄漏;它会被完整的程序泄露。必须有人对释放负责,但仅仅因为它在这里没有发生,并不意味着它根本不会发生。不在delete这里调用也不会“泄漏内存”;泄漏内存的是整个程序。像这样的代码不能独立存在。
除非遵循既定模式,否则很难找出责任所在。这就是std::unique_ptr<T>、std::shared_ptr<T>和 等工具std::weak_ptr<T>存在的原因。请使用它们。
迭代器不会失效。迭代器迭代容器的元素,即指针本身。delete不影响与其一起使用的指针。delete影响指向的记忆。
会
erase打电话delete找我吗?
不。
这安全吗?
如果任何其他代码可能尝试容器中任何相同的指向元素,则此类代码将面临双重释放(未定义行为)的风险。delete
再次强调,这不是局部风险,而是整个计划的风险。
同样,弄清楚整个程序上下文中的内存管理通常很困难。请根据情况以适当的方式使用标准库工具,例如std::unique_ptr<T>、std::shared_ptr<T>和。std::weak_ptr<T>有关 C++ 内存管理的正确教程超出了 Stack Overflow 问题的范围。
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |