C++ C+中delete的行为+;与C中的free

C++ C+中delete的行为+;与C中的free,c++,pointers,C++,Pointers,为什么在C99中可以释放空指针,而在C++98中不能删除空指针。此外,为什么行为被归类为未定义?根据new的实现,信息与指针一起存储,因此deallocator应该有足够的信息来释放该块。从C++标准: 这意味着不能使用类型为的指针删除对象 void*因为没有void类型的对象 我看到的唯一重要区别是,如果删除一个空指针,析构函数将不会运行;导致可能的内存泄漏。但这当然不应该成为未定义行为的理由,而应该成为“注意”的标志。它与多态销毁的场景(纯)虚拟析构函数不相似吗。我的意思是,这两种情况都需要

为什么在C99中可以释放空指针,而在C++98中不能删除空指针。此外,为什么行为被归类为未定义?根据new的实现,信息与指针一起存储,因此deallocator应该有足够的信息来释放该块。从C++标准:

这意味着不能使用类型为的指针删除对象 void*因为没有void类型的对象


我看到的唯一重要区别是,如果删除一个空指针,析构函数将不会运行;导致可能的内存泄漏。但这当然不应该成为未定义行为的理由,而应该成为“注意”的标志。它与多态销毁的场景(纯)虚拟析构函数不相似吗。我的意思是,这两种情况都需要特定于实现的知识才能正确地解除分配。

“取决于新的实现”-这是您的问题。你假设内存块有某种与它相关联的属性,但C++中不一定是这样。指针的类型有足够的信息(即类/结构的大小)来释放它,而不需要任何附加信息。正如您所说,调用析构函数也是必要的。

“取决于new的实现”——这就是您的问题所在。你假设内存块有某种与它相关联的属性,但C++中不一定是这样。指针的类型有足够的信息(即类/结构的大小)来释放它,而不需要任何附加信息。正如您所说,调用析构函数也是必要的。

即使编译器可以实现定义良好的行为,也可以指定操作以导致未定义的行为。这是标准授予实施者的自由度。您正在假设
新的
通常是如何实现的。同样,一个实现者可以自由地选择一个完全不同的方案。“注意”是指“注意,你可以通过按下这个按钮来破坏宇宙”?在C++指针中指向可能有或可能没有析构函数的类型。虚无没有任何定义。没有类型,没有大小,没有析构函数。所以你不能删除它。也不能用new创建空指针。在分配的块中不需要实现信息的存储,而C++标准中没有“内存块”。因为它不需要有特性,所以实现可能有也可能没有。因为它可能有也可能没有该功能,所以只能安全地假设实现没有该功能。可以指定操作以导致未定义的行为,即使编译器可以实现定义良好的行为。这是标准授予实施者的自由度。您正在假设
新的
通常是如何实现的。同样,一个实现者可以自由地选择一个完全不同的方案。“注意”是指“注意,你可以通过按下这个按钮来破坏宇宙”?在C++指针中指向可能有或可能没有析构函数的类型。虚无没有任何定义。没有类型,没有大小,没有析构函数。所以你不能删除它。也不能用new创建空指针。在分配的块中不需要实现信息的存储,而C++标准中没有“内存块”。因为它不需要有特性,所以实现可能有也可能没有。因为它可能有也可能没有这个特性,所以只能安全地假设实现没有这个特性。毕竟,C++中的POD不提供析构函数,或者如果希望的话,可以提供一个平凡的析构函数。同样可以为<代码>空白> /COD>实现。@ iCISTABLE:“让我们删除不调用析构函数的空格”,听起来像“让我们完全抛出C++的所有优点,完全没有理由”。这种功能肯定会被新手滥用,他们会提出大量相同的问题。你想要吗?@SigTerm问题不是“什么特性可以让语言更安全”。它是“为什么它被指定为导致未定义的行为”。我并不是在提倡一个不是。它被定义为导致未定义行为,因为定义行为会限制编译器实现者可用的选项,而C++设计者不希望这样做。调用析构函数的必要性不是很有说服力的一点。毕竟,C++中的POD不提供析构函数,或者如果希望的话,可以提供一个平凡的析构函数。同样可以为<代码>空白> /COD>实现。@ iCISTABLE:“让我们删除不调用析构函数的空格”,听起来像“让我们完全抛出C++的所有优点,完全没有理由”。这种功能肯定会被新手滥用,他们会提出大量相同的问题。你想要吗?@SigTerm问题不是“什么特性可以让语言更安全”。它是“为什么它被指定为导致未定义的行为”。我并不是在提倡一个特性,它不是指定的,因为定义行为会限制编译器实现者的可用性,因此C++设计者不希望这样做。