如果new一个包函0个对象的数据,对于基本数据类型,可以delete[],但对于其它类型,比如说一个类,就出现非法操作,比如:char* ps = new char[0];
delete[] ps;
//OKCDialog* pd = new CDialog[0];
delete[] pd;
//error请问这是C语言规定吗?
delete[] ps;
//OKCDialog* pd = new CDialog[0];
delete[] pd;
//error请问这是C语言规定吗?
解决方案 »
- 可以这样定义一个CString常量吗?
- 对于程序执行到这个位置出现Unhandled Exception in myfile.exe (NTDLL.DLL):0XC0000005:Access ...
- 关于串口按十六进制发送数据的问题
- 关于匿名管道的问题
- 如何将汉字转换为HEX?
- 哪里有 <Visual C++实战演练>这本书下载?人民邮电出版社出的
- 有人做过ftp吗,用CFtpFileFind只能找到根目录,再到一下级目录根本就找不出来啊
- 如何读取非我的进程的控件EDIT中的内容?
- 怪异,Vega Prime不响应双击事件
- 我想用sndPlaySound来播放在内存中的一段声音,但是它总是说我没有定义这个函数,为什么?
- 谁知道如何安装mpeg layer-3编码?
- 关于完成端口有多个客户端连接时所产生的问题???
for (int i = 0; i < 0; i++)
//这里调用析构函数可是析构函数是永远没有机会调用的啊!我认为,要让:
CDialog* pd = new CDialog[0];
delete[] pd;
成功运行,也不难,只是编译器没有去做而已,可能就是个规定而已。
相当与
CDialog* pd = NULL;delete pd;//这里报错
//OK
你试都没试过,还是谨慎点好啊!我在很久以前就知道new一个0元素的数组,不会得到一个空指针的。CDialog* pd = new CDialog[0];
CString str;
str.Format("%x", pd);
AfxMessageBox(str);还有,你按F5,用调试的方法运行,CDialog* pd = new CDialog[0];这行程序还会出现内存泄漏(4字节),这些你试过吗?
CDialog* pd = new CDialog[1];
delete[] pd;
很明显,delete[]操作符知道pd里面包函一个CDialog*元素,这样它才能正确的调用CDialog的析构函数。那么:
CDialog* pd = new CDialog[0];
delete[] pd;
无论如何也不应该出错啊!因为这里delete[]操作符也知道pd包函的元素个数(0个),如果按循环的方法来调用数组里面每个元素(CDialog)的析构函数的话,也刚好避过出错的可能,因为它是个空循环啊!
上面这篇文章只是提了一下new一个0大小的数组!
你看看吧,不是相当与CDialog* pd = NULL;吧?但没有说到如何delete这个0大小的数组!
找delete相关的文章也没有结果!唉。