我希望我的类的析构函数删除整个对象,但其中一个成员除外,该成员在其他地方被删除。首先,这是完全不合理的吗?假设不是,我该怎么做?我认为创建一个空主体的析构函数会阻止所有成员被删除(因为析构函数不会执行任何操作),但情况似乎并非如此。

有帮助吗?

解决方案

简短的回答:你不是

再回应:如果“成员”实际上是一个指向一些其他的配置,你可以安排不删除其他分配

但通常情况下,如果你在构造函数中分配的其他块,你想删除它在析构函数。任何东西都不会要求有问题的块的“所有权”的谨慎处理。这将是一个很像普通的C内存管理。可能的,但充满危险。

好运。

其他提示

取决于你的意思是“被删除”的东西。如果他们不是在一个智能指针,并且不显式删除,那么他们不会被删除。各成员,只是类的一部分:

class Bar {
//...
private: 
  Foo foo;
};

不被析构函数删除(因为他们没有动态分配),他们只是摧毁。他们“住”类里面,所以一旦被破坏,就不见了。

如果您正在寻找两个位置之间的共享“所有权”,你想要的是一个动态分配的shared_ptr:

#include <memory>
class Bar {
// ...
private:
  std::tr1::shared_ptr<Foo> foo;
};

如果该构件是由包含(不是由指针或参考),则可以不防止它被删除,并且不应该想。

如果你想删除它,而不是别的地方,然后使其通过指针或引用包含。

class House
{
  Door door; //contained by value, will be destroyed when the House is
}

class House
{
  Door& door; //contained by reference, will not be destroyed when the House is
}

在析构函数的代码是唯一的删除是动态分配的成员。会员的破坏是不可选的,你只能控制你明确地分配之前(与运营商新)的释放。

您想做可以用一个shared_ptr来获得,什么,其中两个类和外部代码共享的指针相同的外部对象。这样一来,只有当所有的指针,该对象超出范围将被删除。但要小心,不要做循环引用,shared_ptr的没有“垃圾收集”智慧。

当然,你可以使用那些地方共享一个普通的指针,但是这是在大多数情况下是一个坏主意,容易给你适当的资源释放后头痛。

首先,如果构件目的通过包含值,它简单地超出范围时,容器对象被销毁,并且不能防止它被自动解除分配。

如果,相反,它是间接的容器对象引用(例如使用指针),你没有做什么特别的事来的的删除。析构函数不会删除任何东西,除非你明确地编写代码来做到这一点。

至于问这是否是不合理的,我想是不是,在一般情况下,但你一定要分清楚(通常在文件中,因为C ++对这个概念没有语言支持),那是什么拥有的部件有问题。

我认为,在大多数情况下,你是在自找麻烦,如果你不以同样的动作破坏整个对象。这听起来像你的类应该有该成员,这就是所谓的析构函数内的清理方法。如果由于某种原因该构件必须被破坏越快,该方法可以返回初

  

首先,这是完全   不合理?

我不会说不通,也许是有问题的。

这是完全有效的一类拥有,因此应注意的清理,而在同一时间具有另一个类的引用或指针到该对象。

然而,这可能是有问题的,如果第二类雷尔应该有一个指针或没有,我宁愿一直使用get-方法检索指针每当我需要它,例如通过调用一个父类或某些资源管理器。

如果您已动态分配的内存此构件有可能一旦你已经销毁对象之前共享参照该部件,如果你确保构件未在对象的析构函数销毁。不过,我认为这种做法是不太合理。

当你谈论类成员在析构函数被删除,你必须让成员但不是指针和那些之间的区别。比方说,你有一个这样的类:


class Foo
{
public:
  Foo() {p = new int;}
 ~Foo(){}

private:
 int a;
 int *p;
};

此类有2个数据成员:一个整数a和指向的整数p。当析构函数被调用时,对象被销毁,这意味着其所有成员的析构函数被调用。发生这种情况即使析构函数的身体是空的。在基本类型,像的整数,调用它的析构函数的情况下,只是意味着它占据所述存储器将被释放。然而,有一个陷阱,当你摧毁一个指针:无论它指向没有得到默认情况下被破坏。对于您必须显式调用delete

所以在我们的例子中,a时就会调用析构函数被破坏,因此将p,但没有任何p点。如果你想释放到p点的记忆,对于Foo析构函数应该是这样的:


~Foo() {delete p};

于是,又回到了你的问题,你的所有类的哪些不是指针会无论什么时候,当对象的析构函数被调用破坏的成员。在另一方面,如果有成员是指针,无论它们指向也不会被破坏,除非你特别要求删除他们在析构函数。

怎么没人提到弱指针和强指针呢?
强指针是正常行为的智能指针。
弱指针是一种智能指针,除非所有强指针都超出范围,否则它无法删除自身。
强指针表示所有权,弱指针表示共享。
看着 boost.shared_ptrboost.weak_ptr洛基的StrongPtr 用于实施。
还看一下 RAII. 。如果您了解 RAII,您自己就会知道这个问题的答案。

这不是没有道理的,但应注意,以确保任何管理资源,这种清理是隐式处理。

(第一个管理资源,人们普遍担心的是记忆,但凡是能泄漏 - 内存,文件句柄,IDispatch接口指针 - 应该有代码隐式处理清理)。

有关由多个对象共享管理的资源(几乎肯定的情况下,如果“这个对象”是应该有一个指针的东西,得到由“该对象”清理),则通常需要任一个“引用计数指针”管理对象或“弱指针”,这取决于你寿命要求。

有关未共享(和特别是那些需要进行适当的管理异常时,可以抛出),那么一个auto_ptr或其它变体可能更适合。管理资源

在斯科特迈尔斯有效的C ++书是用于了解智能指针一个合理的起点,但实际上,你或许应该只是抓住一样的升压并让别人担心会在不起眼的角落的情况下(比如如果一个构造函数抛出异常会发生什么?)对。

这是可能的,但基本上与所述@dmckee它是那么所有权问题。如果是这样的情况而定,你可以去引用计数。即。

class A
{

RefObj* obj;
A()
{

obj = new RefObj;

}

~A()
{
 obj->ReleaseRef();
}
}


RefObj
{

int m_iRefCounter;
RefObj()
{
m_iRefCounter = 1;
}
AddRef()
{
m_iRefCounter++;
}
ReleaseRef()
{
m_iRefCounter--
if(m_iRefCounter == 0)
{
 delete this;
}
}
}

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top