`
kanwoerzi
  • 浏览: 1643174 次
文章分类
社区版块
存档分类
最新评论

C/C++之动态内存分配比较

 
阅读更多

1、C malloc 和 free vs C++ new 和delete:

C 语言的malloc() 和free() 并不会调用析构函数和构造函数。C++的 new 和 delete 操作符 是 "类意识" ,并且当调用new的时候会调用类的构造函数和当delete 调用的时候会调用析构函数。

下面一个例子

运行结果:

如图一

注意:混合用malloc 和delete或者混合用new 和free 是不正确的。C++的new和delete是C++用构造器分配内存,用析构函数清除使用过的内存。

new/delete 优点:

  • new/delete调用 constructor/destructor.Malloc/free 不会.
  • new 不需要类型强制转换。.Malloc 要对放回的指针强制类型转换.
  • new/delete操作符可以被重载, malloc/free 不会
  • new 并不会强制要求你计算所需要的内存 ( 不像malloc)

2、C 的动态内存分配:

看如下例子MallocTest.cpp

结果:

图二

注意:

  • malloc: 用于申请一段新的地址
  • calloc: 用于申请N段新的地址
  • realloc: realloc是给一个已经分配了地址的指针重新分配空间
  • free: 通过指针释放内存

3、C++ 动态内存分配:

使用 "new" 和 "delete"

如下示例:文件: AllocNewTest.cpp

注意:

  • new CCC(3) 为integer 成员的单个对象分配的内存并且设置integer 成员成3.
  • new CCC[3] 创建三个对象,并没有初始化变量

结果如图:

图四

4、C 函数返回一个指针vs C++函数返回的是一个副本:

C 函数返回一个指针

运行结果:

图五

C++ 函数返回的是一个副本:

运行结果

图六

注意:c++的STL string类的赋值构造函数是被用来返回一个值的副本,也就是当我们离开了函数的时候,变量 "ost",不在作用域了,但是所赋复制的内容是有效的。不要返回"return ost.str().c_str()" 作为他的指针,他是不在作用域的内一旦程序离开了函数,并且数据会丢失。

5、C++ 动态内存分配的异常处理:

运行:

  • 观察系统约束: ulimit -a
  • 设置系统约束: ulimit -m 100
  • 以很小的优先权运行: nice -n 19 AllocNewTest

6、C++ Virtual Destructors


运行结果:

图七

注意:

  • 如果删除操作符被应用在基类中,并且其析构函数并不是虚函数,这将会引起内存泄露,因为只有基类的内存被释放掉。
  • 基类的析构函数不是纯虚函数,将不能被作为基类而实现。
  • 类的析构函数可以不是virtual

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics