jar*_*jar 4 c++ arrays memory-management g++
使用gcc版本4.1.2 20080704(Red Hat 4.1.2-48).尚未在Visual C++上进行测试.
在删除"简单"类型的数组时,似乎delete并且delete []工作原理相同.
char * a = new char[1024];
delete [] a; // the correct way. no memory leak.
char * a = new char[1024];
delete a; // the incorrect way. also NO memory leak.
Run Code Online (Sandbox Code Playgroud)
但是,当删除"复杂"类型的数组时,delete会导致内存泄漏.
class A
{
public:
int m1;
int* m2; // a pointer!
A()
{
m2 = new int[1024];
}
~A()
{
delete [] m2; // destructor won't be called when using delete
}
};
A* a = new A[1024];
delete [] a; // the correct way. no memory leak.
A* a = new A[1024];
delete a; // the incorrect way. MEMORY LEAK!!!
Run Code Online (Sandbox Code Playgroud)
我的问题是:
delete和delete []在g ++下是一样的?这完全取决于底层内存管理器.简而言之,C++要求您使用删除数组delete[]并删除非数组delete.标准中没有解释您的行为.
然而,可能发生的是delete p;简单地释放内存块p(无论是否是数组).另一方面,delete[]另外另外一个遍历数组的每个元素并调用析构函数.由于正常的数据类型,如char没有析构函数,有没有效果,所以delete并delete[]最终做同样的事情.
就像我说的,这是所有特定的实现.无法保证delete可以在任何类型的数组上工作.它恰好适用于您的情况.在C++中,我们称之为未定义的行为 - 它可能有效,可能不行,它可能会做一些完全随机和意外的事情.你最好避免依赖未定义的行为.
char * a = new char[1024];
delete a; // the incorrect way. also NO memory leak.
Run Code Online (Sandbox Code Playgroud)
不,它没有保证No memory leak.它实际上调用了未定义的行为.