 |
overflow的意见:
应该是delete[]str。delete str只是释放了一个字节的内存(str指向的那个字节)另外29个字节并未释放。不知道你在C++ Builder中为什么出错,在VC中肯定是没问题的。
T1000 的意见:
应该使用delete str。当char **str=new char*[n]时则使用delete []str。
123的意见:
delete str是删除的指针而DELETE [] STR是删除指针与内容。
SAGA的意见:
use SystemMonitor to monitor memory. you will find that the memory will not be released if you use delete str to
release memory allocated by new operator. if u use new str[x], you must use delete []str to release the memory.
By the way,using "delete []str(p to p)" just release the memory of pointer array pointed by str and doesn't release the memory pointed by the pointers of the pointer array.
lgw的意见:
delete str并不会释放你所分配的空间。按照此方法后,指针照样能使用而且不会错。应该按照delete []str来释放。各种编译器对此种解释不一样。
midholy的意见:
我在C++Builder6下面研究了一下。delete和delete[]效果是一样的。
unsigned char *rgb2 =(unsigned char *)::operator new(1);
unsigned char *rgb3 =(unsigned char *)::operator new[](1);
unsigned char *rgb4 =(unsigned char *)new char;
unsigned char *rgb5 =(unsigned char *)new char[100];
::operator delete(rgb2);
::operator delete(rgb3);
delete(rgb4);
delete[](rgb5);
经过研究上述代码(汇编代码,和sourc目录下的c代码)的实现,发现在bcc下面,带[]其实也是直接调用不带[]的操作了。
另new char就是直接调用::operator new()
littlestar的意见:
对于系统的基本数据类型(整数,字符等)的数组,delete和delete []的效果一样。对自定义结构/类,效果就不一样。
晓冲的意见:
str = new char[30];
这是new出来的是一个char *的数组,所以应该用delete []str;
如果str = new char("test");
这是new出来的是一个char *指针。
axcw的意见:
in this case, delete[] and delete have the same effect.
对于缺省的delete和new,都是调用malloc()和free()函数,根据这两个函数的实现原理,对于C++的基本数据类型(由关键字定义的)或者没有定义析构函数的用户类型,当由new分配堆空间时,用delete和delete[]释放内存没有任何区别。
但是,如果用户类型中,定义了析构函数,那么,delete和delete[]就有巨大的差别。
当然,这只是对于缺省的new和delete操作符而言,对于用户定义的new和delete,就另当别论。
g++, redhat linux 8.0, 测试通过。
此问题由SAGA等回答。
附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 其他方面, 。
|