细说C++中的new与delete
作者:网络转载 发布时间:[ 2014/3/5 10:38:23 ] 推荐标签:C++ 动态分配 管理
(2) delete opeartor
[::] delete cast-expression
[::] delete [ ] cast-expression
上面是delete operator的原型,第一种用来释放普通的对象(包括内建类型)类型的内存,第二种用来释放对象的数组类型的内存。在C++中,用new operator分配的动态内存,必须调用delete operator来释放,通常用delete operator释放内存编译器要做下面两项工作:
a. 调用对象析构函数来析构对象
b. 调用operator delete function来释放内存(deallocate the memory)
3. 关于new/delete使用过程中一些需要注意的点
(1)如何区别operator new/delete function 与 new/delete operator ?
通过上面的讲述,不难看出,我们分配/释放动态内存,调用的是new/delete operator, 而在调用new/delete的过程中,编译器会自动调用operator new/delete function来完成实际的内存分配/释放的工作
(2) 用delete operator去释放一块不是由new operator释放的内存,结果是不可预料的,因此,切记,operator new与operator delete一定要配对使用,这是写好程序的基础
(3) new operator调用失败会抛出std::bad_alloc异常,前提是你没有自己重载对应的operator new function;delete operator失败,常见的原因是多次delete同一块内存
(4) 如果一块内存被delete后,再对它解引用(Dereference),结果也是不可预测的,很可能导致程序崩溃
(5) delete一个空(NULL)指针是安全的,没有任何害处的
(6) 类成员类型的operator new/delete函数必须为静态(static)函数,因此它们不能为虚函数(virtual function),也遵守public, protected, private的访问权限控制
4. 关于上面所讲的内容的一些例子:
程序:
#include <stdio .h>
#include <stdlib .h>
void * operator new(size_t unSize)
{
printf("operator new called
");
return malloc(unSize);
}
void * operator new(size_t unSize, int nLine, const char * pFunc)
{
printf("operator new called, line: %d, func: %s
",
nLine, pFunc);
return malloc(unSize);
}
void operator delete(void * pMem)
{
printf("delete1
");
free(pMem);
}
class A
{
public:
A(int a = 0) :
_a(a)
{
printf("constructor called
");
}
{
printf("~A()
");
}
static void operator delete(void * pMem, size_t unSize)
{
printf("delete2: %u
", unSize);
free(pMem);
}
private:
int _a;
};
class B: public A
{
public:
~B()
{
printf("~B()
");
}
int _b;
int _bb;
};
int main()
{
A * pA = new A(10);
printf("#######
");
A * pB = new (__LINE__, __func__) B();
printf("#######
");
A * szA = new A[10];
printf("#######
");
delete pA;
printf("#######
");
delete pB;
printf("#######
");
delete [] szA;
printf("#######
");
char * pC = NULL;
delete pC;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11