为共享指针调用自定义删除器类成员函数

时间:2014-10-07 23:59:29

标签: c++

我偶然发现Stack Overflow上的这篇文章: make shared_ptr not use delete

我从Nicolai M. Josuttis的C ++标准库书中得到了一个相关的问题。以下是本书的以下代码:

#include <string>  
#include <fstream>   // for ofstream  
#include <memory>    // for shared_ptr  
#include <cstdio>    // for remove()  

class FileDeleter
{
  private:
  std::string filename;
  public:
  FileDeleter (const std::string& fn)
  : filename(fn) {
  }
  void operator () (std::ofstream* fp) {
   delete fp;                     // close file
   std::remove(filename.c_str()); // delete file
  }
};

int main()
{
 // create and open temporary file:
 std::shared_ptr<std::ofstream> fp(new std::ofstream("tmpfile.txt"),
                                  FileDeleter("tmpfile.txt"));
//...
}  

我理解删除函数的签名应该是以下内容:

void Deleter(T* p)

所以在上面的例子中,如何删除函数(指定为FileDeleter(&#34; tmpfile.txt&#34;))看起来是类的构造函数调用而不是具有上述格式的函数?如何在破坏共享指针时实际调用删除函数?

1 个答案:

答案 0 :(得分:1)

FileDeleter("tmpfile.txt")创建一个删除对象以传递给共享指针。

共享指针的实现将这个副本存储为变量,以及托管对象,沿着

行。
std::ofstream * object;
FileDeleter deleter;

共享指针的析构函数将以

的形式调用它
deleter(object);

将调用删除器的重载operator(),删除对象并删除文件。