【问题标题】:Behaviour of malloc with delete in C++C++ 中 malloc 与 delete 的行为
【发布时间】:2012-06-06 22:14:39
【问题描述】:
int *p=(int * )malloc(sizeof(int));

delete p;

当我们使用 malloc 分配内存时,我们应该使用 free 释放它,当我们在 C++ 中使用 new 分配时,我们应该使用 delete 释放它。

但是如果我们使用 malloc 分配内存然后使用 delete,那么应该会有一些错误。但在上面的代码中,C++ 中没有错误或警告。

此外,如果我们使用 new 反转和分配并使用 free 释放,那么也不会出现错误或警告。

为什么会这样?

【问题讨论】:

  • 同时考虑构造函数和析构函数。
  • 可能没有警告,但绝对是错误。 (无论如何)
  • "应该有一些错误" - 谁说的?该行为是未定义的,C++ 标准没有对应该发生的事情发表评论。如果你想要一个错误,你可能需要使用另一个工具,比如valgrind

标签: c++ malloc delete-operator


【解决方案1】:

这是未定义的行为,因为没有办法可靠地证明指针后面的内存已正确分配(即,new 分配给deletenew[] 分配给delete[])。确保此类事情不会发生是你的工作。当您使用正确的工具(即智能指针)时,这很简单。每当你说delete,你就错了。

【讨论】:

  • 基本上,C++ 标准说,如果你用malloc 分配并用delete 释放,你可以发动核打击。你不希望这种情况发生,对吧,现在?好吧,让我们现实一点:如果你坚持这样做,你会在几个月或几年后支付它,在你应该去家庭度假的前 3 天,你将花费 48 小时来解决问题。这就是未定义行为在实践中的含义。不眠之夜。
  • 哇哇哇哇,我一直陪着你,直到你的最后一句话,我喜欢智能指针。但是,它们并不总是适合替换 new/delete(例如,如果您正在编写自己的智能指针类,并且您正在部署到没有标准库的嵌入式机器上怎么办?如果您被卡住了怎么办?使用只提供 auto_ptr 作为智能指针的旧编译器?),所以说使用 delete 是“做错了”是不必要的限制(即使智能指针通常是更好的方法也是如此)。
  • 其实,那仍然做错了。您不应该在智能指针中直接使用delete,而应该使用一个函数对象(作为模板或类型已擦除)并使用它来删除该对象。添加智能指针所需的唯一一次删除是在std::default_deleter
  • @KyleStrand 呃,那些愚蠢的论点一次又一次地出现。如果您正在编写自己的智能指针类或编写嵌入式软件,您不会想知道是否可以混合使用 malloc 和 delete。错误的观众。除了编写自己的智能指针的情况接近 0,因为 unique_ptr 对几乎所有事情都足够通用(其他情况是 shared_ptr 或深度克隆 value_ptr 并且所有这些都已经写好了)。如果你被 5 岁以上的编译器困住了,那么有人肯定做错了(也是 Boost)。
  • @CatPlusPlus 在那种情况下,听起来你真正的意思是“当初学者使用delete时,他们做错了”——这可以说是真的,但你说的是远比这更广泛。至于 5 年以上的编译器,我在一家公司工作,该公司目前正在为几个使用 MSVC 2008(在一种情况下是 2003 年)针对 XP Embedded 和 Windows Embedded Standard 2009 编程的嵌入式系统提供发布后支持,它们只是作为他们正在进行的维护工作的一部分,没有人力将代码库向前移植,也没有任何紧迫的理由这样做。
【解决方案2】:

使用free() 而不是delete

如果你是malloc,那么你必须调用free 来释放内存。

如果你 new 你必须调用 delete 来释放内存。

Here 是一个解释它的链接。

【讨论】:

    【解决方案3】:

    那么应该有一些错误

    有。只是不一定很明显。

    C++ 标准(以及模仿 C++ 标准的 C 标准)称这种错误为未定义行为undefined 意味着任何事情都可能发生。程序可能会正常继续,可能会立即崩溃,可能会产生明确定义的错误消息并优雅退出,可能会在实际未定义行为事件后的某个时间开始出现随机错误,或者invoke nasal demons

    您有责任注意并消除这些错误。没有任何事情可以保证在它们发生时提醒您。

    【讨论】:

    • 我同意这是 UB,但我想要一个标准参考来说明它所说的位置:)
    • @EmilyL:C++ 标准没有专门解决新的和免费的混合问题。它说你只能通过删除你从新获得的东西。 C 标准同样提到了 malloc 和 free。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多