【发布时间】: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