统计

  • 随笔 - 50
  • 文章 - 42
  • 评论 - 147
  • 引用 - 0

留言簿(6)

随笔分类

文章分类

Link

搜索

  •  

积分与排名

  • 积分 - 160311
  • 排名 - 161

最新评论

阅读排行榜

评论排行榜

C++对象内存模型

由于种种原因,我们无法保证所有通过new在heap中申请的内存资源都安全地得到释放,例如:

class base{...};
void f()
{
   base* ptr = new base;
   ...
   delete ptr;
}

这样一系列操作中,在"..."中可能会抛出异常,最终导致delete无法得到执行,于是就造成了内存泄露。尽管我们可以设法避免在"..."中抛出异常,但是,对于后来维护和修改这段代码了人员来说,很可能加入一些控制流,从而过早地从函数从中返回,内存泄露再次发生。

一种解决之道就是,将资源封装在一个类中,利用类的析构函数来释放该资源,这样一来,无论是何种方式退出f()函数的作用域,类的析构函数总是会被调用,从而有效地避免了资源泄露。

auto_ptr就是这种方法的一种典型应用。它被称为智能指针,是一个模板类。声明一个只能指针的方法是:auto_ptr ptr(new T);为了说明auto_ptr的用法,下面是一个具体的例子:

#include <iostream>
#include <memory>      //为了使用auto_ptr你必须包含头文件:#include <memory>
using namespace std;

class demo
{
public:
  demo ()
  {
    cout << "demo()" << endl;
  }
   ~demo ()
  {
    cout << "~demo()" << endl;
  }
};
void
test_org ()
{
  cout << "test_org():" << endl;
  demo *ptr = new demo;
  return;
}

void
test_auto ()
{
  cout << "test_auto():" << endl;
  auto_ptr < demo > ptr (new demo);
  return;
}

int
main (int narg, char **arg)
{
  test_org ();
  test_auto ();
  return 0;
}

linux下,g++编译器的输出结果如下:
~$ g++ test.cpp -o test
~$ ./test
test_org():
demo()
test_auto():
demo()
~demo()

posted on 2009-03-11 14:36 pear_li 阅读(260) 评论(0)  编辑 收藏 引用 所属分类: C++


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