【问题标题】:how to delete a new of an object of base class in a derivative class?如何删除派生类中基类对象的新对象?
【发布时间】:2020-03-12 03:16:38
【问题描述】:

假设我有一个基类,它包含一个指针和一个删除指针的析构函数。

class Base {
private: 
  int *p;
public:
  Base(int data) : p(new int[data]) {}
  ~Base() {delete[] p;}
};

我有一个派生类,它还包含一个指针,并有一个方法,我可以在其中创建一个新的基类。

class Drived: public Base{
private:
  Base* _root;
public:
  Drived(int data) : Base(data), _root(new Base(data)) {}
  ~Drived() {delete _root;}
  void myMethod() {Base* bewBase = new Base(10);}
};

所以如果我这样做,我会发生内存泄漏,因为在方法 myMethod 中我做了一个新的并且从不删除它。
我想知道如何解决这个问题。
提前感谢您帮助我。
P.S:这个问题中的代码只是示例,我没有正确编译。我只是想更好地了解我的问题。我也知道我可以为这类员工使用std::unique_ptr,但我真的很想学习如何管理这种抛出原始指针。

【问题讨论】:

  • 关于实际问题:您完全忽略了newed 在myMethod 中的指针。它应该用来做什么?您必须确保删除它,例如通过在myMethod 末尾调用delete bewBase;。但我根本不明白这与继承有何关系。您在派生类中使用基本类型,就像任何其他普通类型一样。该类的额外继承与您编写的内容无关。
  • 你为什么使用Base *Base 就可以了?
  • @uneven_markoh 抱歉。你是对的
  • @uneven_mark 我在问当驱动类的对象被删除时,如何在派生类的方法中删除新的基类。我的意思是如何删除驱动类的新内部析构函数而不是方法主体
  • 如果你想在Drived的析构函数被调用时删除你newed的对象,那么你需要在Drived中存储一个指向该对象的指针并调用@ 987654334@ 在析构函数中。 @JoseMaria 给了你一个例子。对象是Base 类型还是其他类型与此完全无关。如果Drived 不是从Base 继承,也许可以尝试解释一下你认为会有什么不同。您可能对继承的作用有些误解。

标签: c++ memory destructor new-operator


【解决方案1】:

类似这样的:

class Drived: public Base{
private:
  Base* _root;
  Base* bewBase;
public:
  Drived(int data) : _root(new Base(data)) {bewBase = nullptr;}
  ~Drived() {delete _root; if (bewBase != nullptr) delete bewBase;}
  void myMethod() {bewBase = new Base(10);}
};

或者你可以重用_root指针,并在新分配之前删除_root的内容。

【讨论】:

  • 重用_root内容是什么意思??
  • "reuse _root pointer",如果你只需要一个指向基类的指针,你可以这样做: void myMethod() {delete _root; _root = new Base(10);}
  • 请不要使用NULL,而是使用std::nullptr
  • @Frank • nullptr 是关键字,因此它没有标准。 std::nullptr_t(在<cstddef>中)是decltype(nullptr)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多