在new []之后删除:有或没有用户析构函数

 我是刘平2010_327 发布于 2023-02-09 14:19

删除指向分配的数组的指针new []是"未定义的行为".我只是好奇为什么delete下面代码中的第一个导致堆损坏如果定义了析构函数,否则没有任何反应(正如我谦卑地预期的那样).使用Visual Studio 8和GNU GCC 4.7.2版(http://www.compileonline.com/compile_cpp11_online.php)进行测试.

struct A
{
   //~A() {}
};

int main()
{
   A* a = new A[10];
   delete a;    //  heap corruption when the user destructor is defined

   int *b = new int[100];
   delete b;    //  no heap corruption
};

Lightness Ra.. 6

UB不是你可以在语言范围内合理化的东西,至少没有工具链,优化级别,操作系统,架构和处理器的详细知识.

但是,在猜测中:没有析构函数可以调用,编译器根本不会生成任何使代码的错误在现实世界中可见的代码.这样的析构函数调用可能会触及动态分配的内存块的标头,这在单个new A示例中不存在.

2 个回答
  • 不匹配new,new[],delete并且delete[]不确定的行为.真的,这是讨论的结束.

    之后会发生任何事情.进一步分析是没有意义的.

    2023-02-09 14:21 回答
  • UB不是你可以在语言范围内合理化的东西,至少没有工具链,优化级别,操作系统,架构和处理器的详细知识.

    但是,在猜测中:没有析构函数可以调用,编译器根本不会生成任何使代码的错误在现实世界中可见的代码.这样的析构函数调用可能会触及动态分配的内存块的标头,这在单个new A示例中不存在.

    2023-02-09 14:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有