在remove_if谓词中调用delete是否安全?

Jul*_*r C 0 c++ iterator

我有一个向量

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给我吗?我有点困惑。这会使迭代器无效或泄漏内存吗?

Kar*_*tel 5

这会使迭代器无效或泄漏内存吗?

内存不会因个别代码而泄漏;它会被完整的程序泄露。必须有人对释放负责,但仅仅因为它在这里没有发生,并不意味着它根本不会发生。不在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 问题的范围。