2015-10-14 57 views
1

据我了解智能指针,他们在那里以避免内存泄漏等。然而,通常还有需要发布的对象,但不是freedelete。有没有一些通用的方式来使用这样的指针与模板?将可释放对象包装成智能指针

举一个例子FILE想到了,完成后应该使用fclose。当然,还有其他类型的指针具有其独特的发布功能。那么我是否必须实施单独的包装来说明他们的个人发布方法,还是有更好的方法来做到这一点?

东西,可能这样使用:

smart_ptr<FILE, fclose> fl = fopen(); 
smart_ptr<IStream, T->Release> pFileStream = SHCreateStreamOnFile(...); 
+0

是的,标准库中的智能指针接受自定义发布函数。 –

回答

1

如果您使用的是unique_ptrshared_ptr,则可以提供您的自定义删除程序。用于unique_ptr所述删除器作为模板参数被传递,并

删除器必须是函数对象或左值参照函数对象或左值参照功能,可调用类型unique_ptr<T, Deleter>::pointer

的参数对于shated_ptr,应该提供删除器作为构造器参数。

class Foo 
{ 

}; 

class Deleter 
{ 
public: 
    void operator()(Foo *) 
    { 
     std::cout << "deleter"; 
    } 
}; 

int main() { 
    std::unique_ptr<Foo, Deleter> ptr(new Foo()); 
    std::shared_ptr<Foo> ptr1(new Foo(), 
          [](Foo*){std::cout << "deleter for shared_ptr";} 
          ); 
} 

你必须要小心,不要造成内存泄露,虽然。

+0

但这仍然意味着我必须为每种类型的对象编写一个单独的删除器,对吗? – Devolus

+0

@Devolus,是的,对于需要特定治疗的每种类型的对象。 – SingerOfTheFall

+0

好的。我希望通过提供方法来使用巧妙的模板或类似的东西来解决这个问题,而不必担心这一点。 :) – Devolus

0

两个shared_ptrunique_ptr提供了便利。


shared_ptr对于中,构造是一个模板:

可选删除器d可以被提供,其随后用于销毁对象时没有shared_ptr对象拥有它。默认情况下,类型Y的删除表达式用作删除器。

在这种情况下,删除器可以是任何可调用,拷贝构造,这让类型擦除的调用。

对于unique_ptr,所述删除器的类型是指针本身的类型参数:

template< 
    class T, 
    class Deleter = std::default_delete<T> 
> class unique_ptr; 

有在这种情况下没有擦除,并且被提供给C-TOR或复位实际匹配的删除器删除者类型。

0

您可以使用自定义删除程序构建shared_ptr(签名#3 here)和unique_ptr(签名#2 here)。

using T = ...; 
auto deleter = [](T* x) { delete x; }; 

// different deleter - different unique_ptr type 
// deleter is stored inline 
auto x = std::unique_ptr<T, decltype(deleter)>(new T(...), deleter); 

// same shared_ptr<T> type regardless of the deleter type, 
// deleter is stored in the "shared state" 
auto y = std::shared_ptr<T>(new T(...), deleter); 

注意,make_shared()不能用来构造shared_ptr与定制删除。