所有分配有new
的对象都必须具有相应的delete
以避免泄漏。 new[]
和delete[]
(这些碰巧是单独的运营商,BTW)也是如此。
作为J.N.在上面的代码示例中指出,不妨使用堆栈并避免操作符new/delete。如果流的使用仅限于某个明确定义的范围,则不需要在免费商店(堆)上创建对象。
你实际上不需要的是拨打close
。文件流在被销毁时已经关闭(在destuctor中),所以可以忽略它。事实上,这是使用文件流对象上的fopen/FCLOSE我们可以看到这里的一大优势:Do I need to manually close an ifstream?
此外,如果您使用C++斯特劳斯具有较强的一致性鼓励他RAII成语的方式,一般希望避免编写需要手动调用删除的代码。这可能是有点在你的头上的那一刻,但我们必须在C++ 11像shared_ptr
和unique_ptr
可用的智能指针,它会自动销毁对象为我们:如果你冒险进入C的境界
shared_ptr<ofstream> output_stream(new ofstream(...));
// ^^ This will not leak and the file will gracefully close
// when 'output_stream' is destroyed. It makes the need to
// call both delete and close unnecessary.
++异常处理,你会发现这种使用析构函数自动清理资源不仅方便,而且对于安全正确地进行编码而言非常重要。
在这种情况下,您需要调用'delete'。该对象分配在堆上,'close()'只关闭所有对绑定到这个对象的实际文件的引用。它不以任何方式处理实际对象的清理。 – 2012-03-02 23:41:31