C++异常错误处理经验谈(2)_C/C++语言_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

C++异常错误处理经验谈(2)

作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0

本篇关键词:处理错误异常copy
黑客防线网安网讯:   例如,应该将分配的内存赋给对象的一个“智能指针”成员对象Fred,而不是分配内存给未被初始化的Fred* 数据成员。这样当该智能指针消亡时,智能指针的析构函数将会删除Fred对象。标准类...

   例如应该将分配的内存赋给对象的一个“智能指针”成员对象Fred而不是分配内存给未被初始化的Fred* 数据成员这样当该智能指针消亡时,智能指针的析构函数将会删除Fred对象标准类auto_ptr就是这种“智能指针”类的一个例子。你也可以写你自己的引用计数智能指针。

  当别人抛出异常时,我如何改变字符数组的字符串长度来防止内存泄漏?

  如果你要做的确实需要字符串,那么不要使用char数组,因为数组会带来麻烦。应该用一些类似字符串类的对象来代替。

  例如,假设你要得到一个字符串的拷贝,随意修改这个拷贝,然后在修改过的拷贝的字符串末尾添加其它的字符串。字符数组方法将是这样:

void userCode(const char* s1, const char* s2)
{
// 制作s1的拷贝:
char* copy = new char[strlen(s1) + 1];
strcpy(copy, s1);

// 现在我们有了一个指向分配了的自由存储的内存的指针,
// 我们需要用一个try块来防止内存泄漏:
try {

// ... 现在我们随意乱动这份拷贝...

// 将s2 添加到被修改过的 copy 末尾:
// ... [在此处重分配 copy] ...
char* copy2 = new char[strlen(copy) + strlen(s2) + 1];
strcpy(copy2, copy);
strcpy(copy2 + strlen(copy), s2);
delete[] copy;
copy = copy2;

// ... 最后我们再次随意乱动拷贝...

} catch (...) {
delete[] copy; // 得到一个异常时,防止内存泄漏
throw; // 重新抛出当前的异常
}

delete[] copy; // 没有得到异常时,防止内存泄漏
}
  象这样使用char*s是单调的并且容易发生错误。为什么不使用一个字符串类的对象呢?你的编译器也许提供了一个字符串类,而且它可能比你自己写的char*s更快,当然也更简单、更安全。例如,如果你使用了标准化委员会的字符串类std::string,你的代码看上去就会象这样:

#include <string> // 让编译器找到 std::string 类

void userCode(const std::string& s1, const std::string& s2)
{
std::string copy = s1; // 制作s1的拷贝

// ... 现在我们随意乱动这份拷贝...
  copy += s2; // A将 s2 添加到被修改过的拷贝末尾

// ... 最后我们再次随意乱动拷贝...
}
  函数体中总共只有两行代码,而前一个例子中有12行代码。节省来自内存管理,但也有一些是来自于我们不必的调用strxxx()例程。这里有一些重点:

由于std::string自动处理了内存管理,当增长字符串时,我们不需要先式地写任何分配内存的代码。
由于std::string自动处理了内存管理,在结束时不需要 delete[] 任何东西。
由于std::string自动处理了内存管理,在第二个例子中不需要 try 块,即使某人会在某处抛出异常。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15195-1.html
网站维护教程更新时间:2012-04-04 22:51:23  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer