学习如何使用智能指针,无论是来自升级、 TR1还是低级(但通常足够高效) auto _ ptr (但是您必须知道它的局限性)。
RAII 是 C + + 中异常安全和资源处理的基础,没有其他模式(三明治等)可以同时满足这两个要求(大多数情况下,它不会同时满足这两个要求)。
下面是 RAII 和非 RAII 代码的比较:
void doSandwich()
{
T * p = new T() ;
// do something with p
delete p ; // leak if the p processing throws or return
}
void doRAIIDynamic()
{
std::auto_ptr<T> p(new T()) ; // you can use other smart pointers, too
// do something with p
// WON'T EVER LEAK, even in case of exceptions, returns, breaks, etc.
}
void doRAIIStatic()
{
T p ;
// do something with p
// WON'T EVER LEAK, even in case of exceptions, returns, breaks, etc.
}
我完全赞同关于 RAII 和智能指针的所有建议,但是我还想添加一个稍微高级的提示: 最容易管理的内存是您从未分配的内存。不像 C # 和 Java 这样几乎所有东西都是引用的语言,在 C + + 中,只要有可能,就应该把对象放到堆栈上。正如我看到的一些人(包括 Dr Stroustrup)指出的,垃圾收集在 C + + 中从未流行的主要原因是,编写良好的 C + + 首先不会产生太多垃圾。