关于delete和delete[ ]混用的未定义问题解释

我们知道delete用于释放一个动态空间,而delete[ ]用于释放多个动态空间,但是如果我们混用的话会导致什么问题?我在博客上看了许多文章,但不尽人意,因此写下这篇文章让你知其然知其所以然(浅薄的解释,望指正)。

---------------------------------------------------------------------------------------------------------------------------------

我们可以先看一个例子:

运行结果为:

但是如果我们不显式地写析构函数:

结果是正常运行:

---------------------------------------------------------------------------------------------------------------------------------

why?

如果我问你系统分配了多少空间给这10个A类对象,那你大概率会回答40字节。很好理解嘛,一个A是4个字节,10个就是40字节。但是实际上,如果你自己写了析构函数那么总共分配了44个字节,如果没写析构函数那么才总共分配40个字节

为什么写了析构函数就多了4个字节?我们知道用delete释放这块空间后会自动调用析构函数(http://t.csdnimg.cn/f2FOj),(1)此时如果我们自己写了析构函数,delete需要去调用它(事实上delete也是一个函数,相当于函数的嵌套调用了),那么调用几次就是个问题,这四个字节恰好是一个整形的大小,这个整形用以记录这块空间的对象个数,从而确定需要调用几次构造和析构函数。然而,你要知道,p指针指向的仍然是第一个对象,只是在构造和析构时会向前走获取一下对象个数,具体关系如下:

(2)如果此时我们没写析构函数,他就会调用编译器生成的析构函数,不用记录次数(可能涉及更底层,我也不太清楚,望指正),也就不用多开一个整形。

好,现在可以解释上面的例子了

delete默认从指针指向的位置释放空间;而delete[ ]默认先查看是否多开了空间,如果多开了指针就向前移动一位再释放。如果多开了空间还是用delete释放空间的话那么多开的空间无法释放就造成内存泄漏,所以报错。

练习一下这个会报错吗?:

不用调用析构函数也就不用计录对象个数,也就不多开空间,因此可以从指针指向位置释放空间,所以不会报错。

情况很多,可以自己下去多试一试。

表达能力欠缺,麻烦多读几次,一定有收获。

相关推荐

  1. C++——关于newdelete

    2024-07-11 23:46:05       20 阅读
  2. c++:newdelete运算符重载

    2024-07-11 23:46:05       53 阅读
  3. C# action,delegate,func区别

    2024-07-11 23:46:05       49 阅读
  4. [C++] newdelete

    2024-07-11 23:46:05       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 23:46:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 23:46:05       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 23:46:05       58 阅读
  4. Python语言-面向对象

    2024-07-11 23:46:05       69 阅读

热门阅读

  1. 2024.7.7刷题记录

    2024-07-11 23:46:05       20 阅读
  2. Vue3 + Vite项目使用SVG图片

    2024-07-11 23:46:05       19 阅读
  3. 代码随想录-DAY⑤-哈希表——leetcode 242 | 349 | 202

    2024-07-11 23:46:05       22 阅读
  4. Python爬虫-requests模块

    2024-07-11 23:46:05       25 阅读
  5. AIGC各个应用场景下的模型选择

    2024-07-11 23:46:05       24 阅读
  6. 在Linux中使用Typora将Markdown文档导出为docx格式

    2024-07-11 23:46:05       19 阅读
  7. 编程语言与数据结构的关系:深度解析与探索

    2024-07-11 23:46:05       21 阅读
  8. 华为OD机考题(HJ108 求最小公倍数)

    2024-07-11 23:46:05       18 阅读