C++学习笔记之1:使用相同形式的new和delete

原创 2007年09月23日 13:40:00
 

HTML Tags and JavaScript tutorial



C++学习笔记之1:使用相同形式的new和delete




首先,从c到c++我们就应该抛弃malloc和free而用new和delete来代替之。
而malloc&free和new&delete的主要区别是new不但为一个对象申请了一片内存同时还会调用这个对象的构造函数,在这个构造函数里可能还会去申请内存,而malloc是不会这么智能的,free则是new的反向执行。所以明确一个问题是:
   malloc&free和new&delete不可以混用,比如用new申请而用free释放。
那么在使用new和delete还要注意些什么呢?先看一段小代码:
==C代码
    /* 申请一片内存 */
     char *p = (char *)malloc(1000);
         .
         .
         .
      free(p);
如果你沿用C语言的习惯,那么在C++的代码中应该是这样的:
     string *p = new string[1000];
      .
      .
      .
     delete p;
如果你这样的话将会造成灾难性的后果,上面的C++代码中所建立的1000个string对象只有第一个被删除,剩余的999个就不知道跑到哪里去了,这是内存泄露的典型例子,切记!那应该怎么样呢?应该用以下方式:
    delete [ ] p; 
这个方括号很重要,告诉系统你要释放的是一个数组而不是一个单一的指针。
如果你仅仅申请了一个对象,那么删除的时候应该怎么释放呢?如:
     string *p = new string;
释放时应该用
    delete p;
而不能是    delete [ ] p; 如果你加了括号则结果是不可预知的,换句话说就是什么都可能发生:)
总结一下,使用new和delete的时候一定要注意前后匹配,如果你申请的是一个数组,那么释放的时候一定要加方括号;如果你仅仅申请了一个对象,那么释放时千万不要加上方括号!


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式

User the same from in corresponding uses of new and deletes 条款16:User the same from in correspond...

【从C到C++学习笔记】域运算符/new/delete运算符/重载/Name managling/extern "C"/带函数默认值参数

C++学习笔记15 malloc free 与 new delete的区别

#include #include /* run this program using the console pauser or add your own getch, system("pa...

C++之成对使用的new和delete时采取相同形式(16)---《Effective C++》

条款16:成对使用new和delete时候采取相同形式成对使用的new和delete需要采用相同的形式,可以先看如下代码:std::string* stringArray=new std::strin...

条款16:成对使用new和delete时要采取相同形式

条款16:成对使用new和delete时要采取相同形式

Effective C++(16) 成对使用new和delete时要采取相同的形式

问题聚焦: 我们都知道,new和delete要成对使用,但是有时候,事情往往不是按我们预期的那样发展。 对于单一对象和对象数组,我们要分开考虑 遇到typedef时,也需要搞清...

effective c++ 条款13,16(以对象管理资源,成对使用new delete的形式相同)

问题如下: 省略号部分可能出现return语句,所以后面的delete可能不被执行,导致内存泄漏。 解决方案:使用智能指针令其自动释放资源,或者将释放功能放在析构函数中 auto_ptr ...

每日学习笔记(名字空间,new和delete)

在C++中尽量用而不用 名字空间是管理标示符的一种方法,就是说在同一个名字空间下面只能访问这个名字空间内的标示符 简单的例子就是说比如说   使用了#include   这个宏使用了以后所有...

智能指针基础std::auto_ptr与new、delete的重载学习笔记

在C/C++中我们malloc/new申请的内存都要自行释放,除非程序结束,否则会造成内存泄漏,这么久以来分配释放已经成为一个习惯,但是有时候还是会有疏漏,忘记释放。而C++中有这么一类东西,它可以替...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)