c++---内存问题---delete p和delete[]p 区别
2017-08-10 09:05
351 查看
void test()
{
char*p1 = NULL;
char*p2 = NULL;
p1 = new char;
printf("p1 = %p\n",p1);
delete p1;
printf("p1 = %p\n",p1);
p2 = new char;
printf("p2 = %p\n",p2);
}
运行结果
p1 = 0x82f7008
p1 = 0x82f7008
p2 = 0x82f7008
分析
地址没有变化
class AA
{
public:
AA(){printf("aa\n");}
~AA(){printf("~aa\n");}
private:
int a;
};
void test3()
{
AA *p = NULL;
p = new AA[10];
// eroor delete p;
delete []p;
}
void test2()
{
char *p = new char[10];
//delete p; //right
delete []p;
}
运行结果
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
class A
{
private:
int i;
string s;
public:
~A(){printf("~a\n");}
};
void d(A* p)
{
delete []p;
//delete p; //error
}
void test1()
{
A *p = new A[10];
d(p);
}
int main()
{
test();
return 0;
}
结论
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;
但是对于类对象数组,只能用 delete[]。
对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
delete []objects; // 正确的用法
delete objects; // 错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象
严格应该这样说:后者相当于仅调用了objects[0]的析构函数,漏掉了调用另外99 个对象的析构函数,并且在调用之后释放内存时导致异常
(如果存在析构函数的话),如果对象无析构函数该语句与delete []objects相同
{
char*p1 = NULL;
char*p2 = NULL;
p1 = new char;
printf("p1 = %p\n",p1);
delete p1;
printf("p1 = %p\n",p1);
p2 = new char;
printf("p2 = %p\n",p2);
}
运行结果
p1 = 0x82f7008
p1 = 0x82f7008
p2 = 0x82f7008
分析
地址没有变化
class AA
{
public:
AA(){printf("aa\n");}
~AA(){printf("~aa\n");}
private:
int a;
};
void test3()
{
AA *p = NULL;
p = new AA[10];
// eroor delete p;
delete []p;
}
void test2()
{
char *p = new char[10];
//delete p; //right
delete []p;
}
运行结果
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
class A
{
private:
int i;
string s;
public:
~A(){printf("~a\n");}
};
void d(A* p)
{
delete []p;
//delete p; //error
}
void test1()
{
A *p = new A[10];
d(p);
}
int main()
{
test();
return 0;
}
结论
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;
但是对于类对象数组,只能用 delete[]。
对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
delete []objects; // 正确的用法
delete objects; // 错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象
严格应该这样说:后者相当于仅调用了objects[0]的析构函数,漏掉了调用另外99 个对象的析构函数,并且在调用之后释放内存时导致异常
(如果存在析构函数的话),如果对象无析构函数该语句与delete []objects相同
相关文章推荐
- C++中malloc/free与new/delete的区别及内存分配失败错误处理
- 关于C++中delete释放内存时效性问题
- delete void* 释放内存问题(C++)
- C++内存管理__内存管理(栈、堆(new/delete)、自由存储区(malloc/freee)、全局/静态存储区、常量区)!堆栈内存管理方式的区别
- C++:delete和delete[]释放内存的区别
- C++内存分配问题-----------堆和栈的区别
- C和C++中动态分配和释放内存的方式及其区别
- C++基础---对象数组中delete与delete[]的区别
- C++中的delete和delete[]的区别
- C++中delete和 delete[]的区别
- C++中malloc/free和new/delete的区别---补充(15)《Effective C++》
- c++五种内存分配、堆与栈区别
- 关于pragma pack的用法(四) C++中的内存对齐问题
- C/C++内存问题检查利器—Purify (二)
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C++中delete和delete[] 的区别
- C和C++动态内存分配和释放的区别
- 一个很有深度的C++内存问题---GDB调试(一)
- C++中使用delete 需要注意的两个问题
- 明晰C++内存分配的五种方法的区别