如果在你的环境中不能系统地应用这些技巧(例如,你必须使用别的地方的代码,或者你的程序的另一部分简直是原始人类(译注:原文是Neanderthals,尼安德特人,旧石器时代广泛分布在欧洲的猿人)写的,如此等等),那么注意使用一个内存泄漏检测器作为开发过程的一部分,或者插入一个垃圾收集器(garbage collector)。
我为什么在捕获一个异常之后就不能继续?
换句话说,C++为什么不提供一种简单的方式,让程序能够回到异常抛出点之后,并继续执行?
主要的原因是,如果从异常处理之后继续,那么无法预知掷出点之后的代码如何对待异常处理,是否仅仅继续执行,就象什么也没有发生一样。异常处理者无法知道,在继续之前,有关的上下文环境(context)是否是“正确”的。要让这样的代码正确执行,抛出异常的编写者与捕获异常的编写者必须对彼此的代码与上下文环境都非常熟悉才行。这样会产生非常复杂的依赖性,因此无论在什么情况下,都会导致一系列严重的维护问题。
当我设计C++的异常处理机制时,我曾经认真地考虑过允许这种继续的可能性,而且在标准化的过程中,这个问题被非常详细地讨论过。请参见《C++语言的设计和演变》中的异常处理章节。
在一次新闻组的讨论中,我曾经以一种稍微不同的方式回答过这个问题。
为什么C++中没有相当于realloc()的函数?
如果你需要,你当然可以使用realloc()。但是,realloc()仅仅保证能工作于这样的数组之上:它们被malloc()(或者类似的函数)分配,包含一些没有用户定义的复制构造函数(copy constructors)的对象。而且,要记住,与通常的期望相反,realloc()有时也必须复制它的参数数组。
在C++中,处理内存重新分配的更好的方法是,使用标准库中的容器,例如vector,并让它自我增长。
如何使用异常?
参见《C++程序设计语言》第4章,第8.3节,以及附录E。这个附录针对的是如何在要求苛刻的程序中写出异常安全的代码的技巧,而不是针对初学者的。一个关键的技术是“资源获得即初始化”(resource acquisiton is initialization),它使用一些有析构函数的类,来实现强制的资源管理。
怎样从输入中读取一个字符串?
你可以用这种方式读取一个单独的以空格结束的词:
#include<iostream>
#include<string>
using namespace std;
int main()
{
cout << "Please enter a word:\n";
string s;
cin>>s;
cout << "You entered " << s << ’\n’;
}
注意,这里没有显式的内存管理,也没有可能导致溢出的固定大小的缓冲区。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/