delete p 为何导致程序卡死

Icedmilk 2010-03-04 01:00:57
为了测试delete与delete[]的区别
写了段代码,可是执行到delete p1程序就卡死了。
帮忙看一下是啥原因。
代码如下:

#include <iostream>
using namespace std;

class CdeleteTest
{
public:
CdeleteTest()
{
cout << "constructor" << endl;
}
~CdeleteTest()
{
cout << "destructor" << endl;
}
};

void main()
{
CdeleteTest* p1 = new CdeleteTest[3];
delete p1;

CdeleteTest* p2 = new CdeleteTest[3];
delete[] p2;
}

...全文
399 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Icedmilk 2010-03-04
  • 打赏
  • 举报
回复
结贴了吧,应该就是编译器的问题。
cdsnpeter 2010-03-04
  • 打赏
  • 举报
回复
给new的地方设断点,F11进去看看。基本如我在12楼所说。

CdeleteTest* p1 = new CdeleteTest[1];//这里总共申请的Buffer是5.
CdeleteTest* p2 = new CdeleteTest; //这里总共申请的Buffer是1.

所以,数组new和普通的对象new申请到的Buffer其长度不一样。

delete和delete[] 对Buffer有一个Validate的一个动作,Debug下会弹出Assertion Failed的对话框。
release下,我这里没有弹出那个对话框。

但是,这里的做法是错误的,未定义错误。什么叫未定义错误,就是不晓得会发生什么样的错误。
访问违规?抛出异常?各个不同的编译器都有不同实现,因此我个人认为,纠结于这样的语言细节意义不大。

楼主你可以参考下。
Icedmilk 2010-03-04
  • 打赏
  • 举报
回复
release还是错误
到那里程序就卡住了
伊吹萃香 2010-03-04
  • 打赏
  • 举报
回复
引用 11 楼 icedmilk 的回复:
引用 7 楼 masm32v9 的回复:和你使用的平台和编译器也有关系,此程序在我这里的运行结果是这样: constructor constructor constructor destructor constructor constructor constructor destructor destructor destructor
多谢,你是什么编译器?
我测试用的是GCC编译器。
WizardK 2010-03-04
  • 打赏
  • 举报
回复
引用 10 楼 icedmilk 的回复:
引用 8 楼 wizardk 的回复:
卡死是不一定的,语法错是一定的。
我没问你这个


DELETE是操作符,在堆上释放空间,不同编译器对操作符的实现是不一样的。
cdsnpeter 2010-03-04
  • 打赏
  • 举报
回复
我这里是VC6+ Win XP SP2
Release版本就不会有此问题。但是《Effective C++》说过,你这样的操作,会导致未定义错误。

rendao0563 2010-03-04
  • 打赏
  • 举报
回复
debug版一般会做对应的堆栈检测. 换release就好了.
cdsnpeter 2010-03-04
  • 打赏
  • 举报
回复
你值得是不是会弹出一个Assertion failed的对话框?

《Effective C++》中说过,使用 new Type[]形式申请的内存。
编译器会给你的Buffer前加上一个 size_t 类型,用以保存对象个数。

所以其实此Buffer要比实际申请的长一些。

Debug下,delete调用时,有一个判断buffer有效性的动作。因为是用数组new的形式申请的内存。
其Buffer中包含有对象个数,实际要比new 申请的内存多一个size_t,所以用普通delete就会让这个断言失效。

Icedmilk 2010-03-04
  • 打赏
  • 举报
回复
引用 7 楼 masm32v9 的回复:
和你使用的平台和编译器也有关系,此程序在我这里的运行结果是这样:
constructor
constructor
constructor
destructor
constructor
constructor
constructor
destructor
destructor
destructor

多谢,你是什么编译器?
Icedmilk 2010-03-04
  • 打赏
  • 举报
回复
引用 8 楼 wizardk 的回复:
卡死是不一定的,语法错是一定的。

我没问你这个
zhdf189 2010-03-04
  • 打赏
  • 举报
回复
不同编译器得到的效果不同,卡死也是一种错误状态
WizardK 2010-03-04
  • 打赏
  • 举报
回复
卡死是不一定的,语法错是一定的。
伊吹萃香 2010-03-04
  • 打赏
  • 举报
回复
和你使用的平台和编译器也有关系,此程序在我这里的运行结果是这样:
constructor
constructor
constructor
destructor
constructor
constructor
constructor
destructor
destructor
destructor
Icedmilk 2010-03-04
  • 打赏
  • 举报
回复
VC2008 windows2003
jingzhongrong 2010-03-04
  • 打赏
  • 举报
回复
其原因可能是堆被损坏,这样的测试本来就是有问题的。
rendao0563 2010-03-04
  • 打赏
  • 举报
回复
平台,编译器? `~
blpluto 2010-03-04
  • 打赏
  • 举报
回复
delete p1删除一个元素,估计是维护数据的堆出问题了
Icedmilk 2010-03-04
  • 打赏
  • 举报
回复
对,这个程序就是测试用的

就算错了,delete p也不该卡死啊
bragi523 2010-03-04
  • 打赏
  • 举报
回复
delete p1;
本身是不对的啊

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧