想象一下以下代码:
class CWrapper{public: CWrapper() : m_pHandle(new HANDLE,&CWrapper::Close) { //code to open handle }private: voID Close() { //code to close handle } std::shared_ptr<HANDLE> m_pHandle;}
我也尝试使用HANDLE参数创建close(不理想).无论哪种方式,我得到编译器错误“术语不评估为采用0参数的函数”.这是因为隐含的这个指针吗?我该如何解决?如何从共享指针调用成员函数?
解决方法 我认为你的抽象方式是错误的.shared_ptr为您提供了一个可复制的“句柄”,该句柄可以自行复制.将shared_ptr与在删除时不执行自己的清理的类型一起使用不是最佳用途.
如果让你的类承担在析构函数中正确清理这种固有的不可复制资源的责任,那么你可以使用shared_ptr来提供共享所有权,这是它应该承担的唯一责任. (我认为HANDLE是不可复制的,就像你试图制作HANDLE的简单副本一样,副本不能被视为独立;最后一个副本必须正确关闭,因此副本的所有者需要知道其他副本是否存在.)
class CWrapper{public: CWrapper() { // code to open handle } ~CWrapper() { // code to close handle }private: // prevent copying CWrapper(const CWrapper&); CWrapper& operator=(const CWrapper&); HANDLE mHandle;};
现在使用shared_ptr< CWrapper>在需要共享句柄的地方,如果您认为这样过于冗长,可以使用typedef.
自定义删除器是一个过于复杂的解决方案,恕我直言.
总结以上是内存溢出为你收集整理的c – 一旦引用计数达到0,就让shared_ptr调用成员函数全部内容,希望文章能够帮你解决c – 一旦引用计数达到0,就让shared_ptr调用成员函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)