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

例如

  

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

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

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

我应该在main()中删除“随机”,还是应该将其放入accGen的析构函数中?

  

编辑:

     

即使问题得到很好的回答,我想   仍然说明为什么我使用指针的原因是为了帮助   有人面临着同样的问题。

     

我使用指针的原因是要应用许多模式,例如Factory和   行为。非指针变量似乎无法与   纯虚拟方法,不能显示替代。

     

在设计视图中,我认为对象的创建者始终是   负责删除。这就是为什么让我感到困惑。所有   调用者想要的是一个accGen对象。我通过一个随机对象是   在accGen内部决定Random的实现。然后随机对象   不是呼叫者级别的参与者,那么为什么呼叫者应该   负责删除。但事实是,在某些情况下,   random在呼叫者级别的以下操作中很有用。给定的   例子只是一个例子。

     

在研究了智能指针之后,Unique指针确实是解决方案   我的问题。就状态而言,它使指针变得更加具体   创建此类指针的目的。

     

总而言之,如果将对象传递给构造函数后有用,则   该类型将是纯指针,并且在析构函数中不会删除。如果   该对象在调用者级别无用,则类型应为   唯一指针。

lcxs123 回答:在C ++ OOP中,谁负责删除传递给构造函数的对象

在C ++中,我们使用smart pointers,所以我们不在乎删除。

,
  

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

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

问题是:你不知道。 Random不是指针类型(除非它是SomeOtherType*的误导性别名),但是new会返回指向其创建的对象的指针。

如果您需要动态分配,则可以使用原始指针手动进行操作,并承担delete处理通过new创建的内容的全部责任:

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

这有助于习惯所有权概念。如果一个对象负责管理第二个实例的生存期,则称该对象“拥有”该实例。

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

既不建议也没有必要手动执行此操作。使用smart pointers。如果仅让智能指针完成肮脏的工作,就可以忘记newdelete。 C ++中没有垃圾,尽管始终使用std::shared_ptr可能是最接近使用垃圾收集器的方法。

无论如何,如果您不需要动态分配内存,则不必这样做。 C ++具有值语义。在C ++中,您不仅获得了对对象的引用,还获得了对象。

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

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

(*)=如果一个函数传递了一个原始指针,则不希望它获得所指向对象的所有权。该函数无法知道它是在堆栈上分配还是动态分配。

本文链接:https://www.f2er.com/3106835.html

大家都在问