【问题标题】:Deleting pointer from a vector is corrupting it?从向量中删除指针会破坏它吗?
【发布时间】:2022-07-27 22:56:08
【问题描述】:

调用以下函数时出现以下错误:

这是有效的代码:

std::function<void(const Gui*)> DeleteGuiFunction = [&](const Gui* gui)
    {
        for (int i = 0; i < Guis.size(); i++)
        {
            if (Guis[i] == gui)
            {
                Gui* todelete = Guis[i];

                Guis.erase(Guis.begin() + i);

                delete todelete;

                return;
            }
        }
    };

这是具有相同逻辑但不起作用的代码:

std::function<void(const Gui*)> DeleteGuiFunction = [&](const Gui* gui)
    {
        for (int i = 0; i < Guis.size(); i++)
        {
            if (Guis[i] == gui)
            {
                delete Guis[i];

                Guis.erase(Guis.begin() + i);

                return;
            }
        }
    };

注意 Guis 是该类的成员

不仅在使用 Guis.erase 时会出错,而且如果我在删除其中的元素后执行 Guis.size,那么它在 Vector.h 中也会出现同样的错误

这与 lambdas 有关

错误发生在删除行之后

【问题讨论】:

  • 仅仅因为这是程序崩溃或报告错误的地方并不意味着这就是问题所在。 C++ 不能以这种方式工作。问题可能出现在代码中的任何地方,但在出现错误后,程序会继续运行一段时间,然后最终崩溃。这就是为什么 stackoverflow.com 的 help center 要求您展示一个 minimal reproducible example,其他人都可以完全如图所示剪切/粘贴,然后编译、运行和重现您的问题。有关更多信息,请参阅How to Ask。在您这样做之前,任何人都不太可能回答您的问题。
  • 我无法发现 std::vector 与您的示例有什么关系??
  • @πάνταῥεῖ Guis 是类内部的向量。我确实说过.....
  • 张贴minimal reproducible example @sam 已经提到了!!
  • @Krishganatra 循环删除元素时,要么从头开始,要么连续删除第一个元素

标签: c++ lambda


【解决方案1】:

所以,Guis 是一个指向 Gui 数组的指针,它是动态创建的,即它是由 new 返回的。线

  delete Guis[i];

确实遵循:

  delete Guis + i;

在指针上使用delete 运算符,其值不是由任何新表达式返回的,这是一种未定义的行为。在某些实现中,它会破坏程序的整个动态存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2013-07-02
    • 2011-03-30
    • 2011-04-09
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多