【发布时间】:2011-01-27 19:24:36
【问题描述】:
删除指针和释放指针(分配内存)一样吗?
【问题讨论】:
标签: c++ pointers memory-management
删除指针和释放指针(分配内存)一样吗?
【问题讨论】:
标签: c++ pointers memory-management
删除一个指针(或者删除它指向的东西,或者)意味着
delete p;
delete[] p; // for arrays
p 是在该语句之前分配的,例如
p = new type;
也可能指使用其他的动态内存管理方式,如free
free(p);
之前使用malloc或calloc分配的
p = malloc(size);
后者更常被称为“释放”,而前者更常被称为“删除”。 delete 用于带有析构函数的类,因为delete 除了释放内存之外还会调用析构函数。 free(和malloc,calloc等)用于基本类型,但在C++中new和delete同样可以用于它们,所以没有太多理由在C++,兼容性原因除外。
【讨论】:
new 关心类型并在必要时调用构造函数,还可以扩展它以从与默认不同的内存池中获取内存(分别通过编写自己的operator new 和operator delete)。
你不能“删除”一个指针变量
当然可以;-)
int** p = new int*(new int(42));
delete *p;
delete p; // <--- deletes a pointer
但是说真的,delete 真的应该叫delete_what_the_following_pointer_points_to。
【讨论】:
delete 在释放内存之前调用析构函数。 free 只是释放内存。在从 new 获得的指针上调用 free 会导致未定义的行为。
是的,delete 用于释放内存并调用相关对象的析构函数。
通常的做法是在删除NULL 后设置指针以避免周围出现无效指针:
Object *o = new Object();
// use object
delete o; // call o->~Object(), then releases memory
o = NULL;
当 new 和 delete 在 C++ 源代码中与标准 C 类型一起使用时,它们的行为类似于 malloc 和 free。
【讨论】:
您不能“删除”指针变量,只能将其值设置为 NULL(或 0)。
【讨论】:
是的,删除指针与释放内存或释放内存等相同。
【讨论】:
是的,它调用了适当的析构函数。
【讨论】:
简而言之,是的。
但是你必须小心:如果你使用p = new sometype() 分配,那么你应该使用delete p。如果您使用p = sometype[count] 分配,请始终使用delete [] p
还有一件事:你永远不应该配对 malloc/delete 或 new/free。
【讨论】: