在C++面向对象程序中,谁负责删除传递给构造函数的对象



例如,

我有一个帐户生成器类需要一个随机方法来决定用户名和密码。Random有很多实现方法,因此它是一个接口与许多子类。帐户生成器类接受随机构造函数中的对象。

在Java中,我们不关心对象的删除。但我现在用C++来做。我的问题是,如果我在main((中做了以下操作

Random random=new StdRandom();
AccGen accGen=new AccGen(random);

我应该删除main((中的"random",还是应该把它放在AccGen的析构函数中?

编辑:

即使这个问题回答得很好,我想我也可以仍然说明我为什么使用指针的原因,以便提供帮助面临同样问题的人。

我使用指针的原因是应用许多模式,如Factory和行为非指针变量似乎不能是具有纯虚拟方法,不能呈现重写。

从设计的角度来看,我认为一个物体的创造者总是对其删除负责。这就是为什么它让我感到困惑。全部的调用方希望它是一个AccGen对象。我传递了一个随机对象决定在AccGen内部执行Random。然后随机对象不是调用者级别的参与者,那么调用者为什么要对其删除负责。但事实是,在某些情况下随机在调用方级别的以下操作中很有用。给定这个例子实际上只是一个例子。

经过对智能指针的研究,Unique指针确实是解决方案我的问题。它使指针在到状态方面变得更加具体创建此类指针的目的。

总之,如果一个对象在传递给构造函数后是有用的,那么类型将是纯指针,并且在析构函数中没有删除。如果对象在调用方级别上是无用的,那么类型应该是唯一指针

在C++中,我们使用智能指针,因此我们不关心删除。

我的问题是,如果我在main((中做了以下操作

Random random=new StdRandom();
AccGen accGen=new AccGen(random);

问题是:你没有。Random不是指针类型(除非它是SomeOtherType*的误导性别名(,但new会向您返回一个指向它创建的对象的指针。

如果您需要动态分配,您可以使用原始指针手动完成,并全权负责通过new:创建的delete内容

Random* random = new StdRandom();
AccGen* accGen = new AccGen(random);
// ... do something ...
delete accGen;
delete random;

这有助于了解所有权的概念。如果一个对象负责管理第二个实例的生存期,则称其为"拥有"该实例。

此外,资源在构造函数中获取,在析构函数中释放(如果您想了解更多信息,请阅读RAII(。因此,您可以考虑让accGen负责删除其析构函数(*(中的random

不建议也没有必要手动执行此操作。使用智能指针。如果只让智能指针来做脏活,那么就可以忘记newdelete。C++中没有垃圾,尽管持续使用std::shared_ptr可能最接近于使用垃圾收集器。

无论如何,如果您不需要动态分配内存,那么就不要这样做。C++具有值语义。在C++中,你得到的不仅仅是对对象的引用,还有对象。

int main {
StdRandom random;
AccGen accGen{random};
// ... use accGen ...
}   // <- end of scope

无需删除任何内容。堆栈上的对象在超出范围时会调用其析构函数。

(*(=如果一个函数被传递了一个原始指针,那么它就不应该拥有被指向对象的所有权。函数无法知道它是在堆栈上分配的还是动态分配的。

最新更新