用auto_ptr类模板帮忙动态内存管理[VC/C++编程]
本文“用auto_ptr类模板帮忙动态内存管理[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
动态内存利用最多的是在C++利用程序的代码中.有过编程经验的程序员固然都知道new操作符的利用一定要与delete匹配,在某些场所仍旧大概有内存溢出.当非常被掷出时,程序的正常掌握流程被改变,因此招致潜在的内存溢出.比方,
void g() //大概掷出
{
if (some_condition == false)
throw X();
}
void func()
{
string * pstr = new string;
g(); //假如 g 掷出一个非常,内存溢出
delete pstr; //假如 g 掷出一个非常,则此行为不能到达的代码行.
}
int main()
{
try
{
func();
}
catch(...)
{}
}
当 g 掷出一个非常,非常处理机制展开仓库:g()退出,同时掌握被转移到 main() 的 catch(...)代码块.这时,无论怎样,func()中的delete语句都不会被履行,由此招致pstr的内存溢出.如果利用部分自动串变量,而不是利用动态分配-内存溢出就不会呈现了:string str; //部分自动对象
g(); //没有内存溢出
许大都据重要的构造以及利用,象链表,STL容器,串,数据库系统以及交互式利用必须利用动态内存分配,因此仍旧冒着万一发生非常招致内存溢出的风险.C++尺度化委员会意识到了这个漏洞并在尺度库中增添了一个特别的类模板,它就是std::auto_ptr,其目的是促使动态内存和非常之前举行平滑的交互.Auto_ptr保证当非常掷出时分配的对象(即:new操作符分配的对象)能被自动销毁,内存能被自动释放.下面我们就来谈论利用动态内存时,若何精确和有效地利用auto_ptr来避免资源溢出.这个技术实用于文件,线程,锁定以及与此近似的资源.
Auto_ptr的定义可以在<memory.h>中找到.与尺度库中别的的成员一样,它被声明在命名空间std::中.当你实例化auto_ptr对象时,对它举行初始化的办法是用一个指针指向动态分配的对象,下面是实例化和初始化auto_ptr对象的例子:
#include <memory>
#include <string>
using namespace std;
void func()
{
auto_ptr<string> pstr (new string); /* 成立并初始化auto_ptr */
}
auto_ptr背面的尖括弧里指定auto_ptr指针的范例,在这个例子中是string.然后auto_ptr句柄的名字,在这个例子中是pstr.最后是用动态分配的对象指针初始化这个实例.注意你只能利用auto_ptr构造器的拷贝,也就是说,下面的代码是不法的:
auto_ptr<string> pstr = new string; //编译出错
Auto_ptr是一个模板,因此它是完好通用的.它可以指向任何范例的对象,包含基本的数据范例:
auto_ptr<int> pi (new int);
一旦你实例化一个auto_ptr,并用动态分配的对象地址对它举行了初始化,便可以将它当作普通的对象指针利用,比方:
*pstr = "hello world"; //赋值
pstr->size(); //调用成员函数
之所以能这样做是因为auto_ptr重载了操作符&,*和->.不要被语法误导,记着pstr是一个对象,不是一个指针.
auto_ptr是若何办理前面提到的内存溢出问题呢?auto_ptr的析构函数自动摧毁它绑定的动态分配对象.换句话说,当pstr的析构函数履行时,它删除构造pstr期间成立的串指针.你毫不能删除auto_ptr,因为它是一个本地对象,它的析构函数是被自动调用的.让我们看一下函数func()的订正版本,这次利用了auto_ptr:
void func()
{
auto_ptr<string> pstr (new string);
g(); //假如g()掷出非常,pstr 被自动摧毁
}
C++保证在仓库展开历程中,自动存储范例的对象被自动摧毁.因此,假如g()掷出非常,pstr的析构函数将会在掌握被转移到catch(...)块之前履行.因为pstr的析构函数删除其绑定的串指针,所以不会有内存溢动身生.这样我们在利用动态分配对象时,操纵auto_ptr就实现了自动和安全的本地对象.
以上是“用auto_ptr类模板帮忙动态内存管理[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |