【发布时间】:2013-08-04 16:46:59
【问题描述】:
我想知道是否可以通过创建私有/受保护的析构函数并同时使用 shared_ptrs 来确保自动资源管理(shared_ptr 的 RAII 特性)来强制在堆上创建对象。 可以以不同的方式完成吗? 我问这个的原因是因为我在 STL 听到的(还没有看到)没有虚拟析构函数,所以除了...shared_ptr 之外没有其他方法可以确保安全销毁? 如果是这样,由于 shared_ptr 正在尝试访问析构函数,因此无法强制对象进入堆。 无论如何绕过这些限制?
【问题讨论】:
-
我不明白你提出这个问题的理由。你能试着更准确地解释你想要什么吗?
-
好吧,让我们谈谈一个假设的例子,假设我想创建一个类树并强制这些类的任何用户只在堆上创建对象。因此,只需将描述符设为私有/受保护即可。现在,如果对象超出范围,它就会被销毁,但如果有一个类树并且析构函数不是虚拟的,它就不会被很好地销毁。所以假设我不能使用 virtual 出于某种原因,我如何正确地销毁这些对象?
-
@LifePhilPsyPro 这听起来像是一个错误的问题。 不要使用
virtual,因为这是正确的解决方案。或者,不使用基类指针的继承,那么你就不需要虚拟析构函数。 -
@LifePhilPsyPro:等等,如果我理解正确,你的类是从
std::vector这样的 STL 类派生的吗?这是这些问题的根源吗? -
嗯,实际上没有像理论问题那样多的“实际”问题。我试图弄清楚我能做什么,不能用 c++ 为我提供什么。所以我实际上并没有遇到我必须使用我描述的东西的情况。我只是在考虑如何将智能指针同时用于 RAII 和强制堆分配。我不知道何时以及为什么我可能需要它。但我认为这很有用。
标签: c++ c++11 stl heap-memory