内存分配与释放问题

1.    newdeletemallocfree关系

delete会调用对象的析构函数,new对应,free只会释放内存,new调用构造函数。mallocfreeC++/C语言的标准库函数,new/deleteC++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

2.    delete delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective  C++中有更为详细的解释:delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”deleteNew配套,delete []new []配套

  MemTest   *mTest1=new   MemTest[10];

  MemTest   *mTest2=new   MemTest;

  Int   *pInt1=new int[10];

  Int   *pInt2=new int;

  Delete   []pInt1;  //-1-

  Delete   []pInt2;  //-2-

  Delete   []mTest1;//-3-

  Delete   []mTest2;//-4-

 -4-处报错。

这就说明:删除单个元素指针来说,对于内建简单数据类型,deletedelete[]可以互用。对于自定义的复杂数据型,deletedelete[]不能互用。delete[]删除一个数组,delete删除一个指针,简单来说,用new分配的内存用delete删除,用new[]分配的内存用delete[]删除,delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

关联:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.

posted on 2013-09-16 23:34 cslover 阅读(492) 评论(0)  编辑 收藏 引用 所属分类: C++基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜