【问题标题】:overloading delete, pure virtual func call重载删除,纯虚函数调用
【发布时间】:2010-10-01 09:28:34
【问题描述】:

所以我想重载删除抽象虚拟类。这将在另一个库中的派生类中调用 deleteMe()。这是为了防止这里提到的错误/崩溃C++ mix new/delete between libs?

当我在基类中调用 delete me from delete 时,我收到错误“纯虚拟函数调用”。然后我发现它已经调用了我的 dtor。我如何重载删除或以不调用 dtor 的方式编写此代码,以便我可以编写删除 obj;并让它调用 obj->deleteMe() 然后调用它自己的删除函数和 dtor?

【问题讨论】:

  • 一些代码示例可以帮助回答这个问题

标签: c++ operator-overloading


【解决方案1】:

听起来你使用 operator delete 就像一个应该做任意事情的普通函数。然而,操作符 delete 只应该释放作为第一个参数分配给它的内存,它是指向该内存区域的指针。

该指针将指向您的对象所在的内存位置。但是,此时,您的对象的析构函数已经运行,并且您的对象不再存在。你根本不能在它上面调用任何成员函数——更不用说虚函数了!

我感觉你把操作符删除的目的弄错了。如果调用delete pointer,编译器会调用对象的析构函数,然后调用deallocation函数释放分配的内存,称为operator delete

那么,为什么不使用我们之前向您展示的解决方案,即boost::shared_ptr

【讨论】:

  • 我正在使用 shared_ptr,当它超出范围时会崩溃。我想用 delete 关键字自然地删除 obj 。看起来我不能那样做。现在我在任何地方都使用带有 std::mem_fun 的 shared_ptr 作为第二个参数。效果很好。
  • 是的,我评论说,除了调用 deleteMe 之外,还有一个人回答了调用 delete。我相信你称之为“删除这个;”在那个函数中,所以他会有效地调用 delete 两次。
  • 我推荐 shared_ptr ptr(new T, bind(&T::deleteMe, _1)); ,但随后另一个人发布了另一个答案,我删除了我的评论。
猜你喜欢
  • 2012-03-20
  • 2013-03-27
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多