2014-10-07 59 views
0

类的成员函数我碰巧在这个职位上堆栈溢出跌倒: make shared_ptr not use delete调用定制删除共享指针

,我必须从尼古拉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) 

所以在上面的例子中,它是如何deleter函数(指定为FileDeleter(“tmpfile.txt”))看起来是类的构造函数调用,而不是具有上述格式的函数?如何在这里销毁共享指针实际上调用deleter函数?

+0

_“deleteter函数是如何在这里破坏共享指针时被调​​用的?”_在'shared_ptr'的析构函数中? – 2014-10-08 00:01:11

+0

查找函数。 – programmerjake 2014-10-08 08:53:40

+0

@programmerjake:我知道仿函数。但是我仍然不清楚这就是为什么我问这个问题。 – avish 2014-10-08 12:08:43

回答

1

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

共享指针的实现存储复制这个某处作为一个变量,以及被管理对象,沿着

std::ofstream * object; 
FileDeleter deleter; 

共享指针的析构函数将调用此的行作为

deleter(object); 

这会调用删除者的超载operator(),删除对象并删除文件。

+0

谢谢迈克!为了更加美观,我可以假设deleter对象FileDeleter(“tmpfile.txt”)在shared_ptr的实现中的某个位置被“复制”,并且该对象上的operator()被调用?这是否意味着该类需要有一个公共的拷贝构造函数? – avish 2014-10-08 12:14:41

+0

@avish:如果您将其作为_rvalue_传递(如您在此处所做的那样),它将被复制或移动;所以它确实需要公共副本或移动构造函数。通常,当标准库需要一个仿函数时,它会根据需要采用它并复制/移动它。 – 2014-10-08 15:52:30