删除动态分配的派生对象 - 多态

Delete dynamically allocated derived objects - Polymorphism

我不知道如何通过基指针删除动态分配的子classes。分配在 App-class 中,如何从主方法中删除分配的对象?

#include <iostream>

using namespace std;

class Base {

public:
   virtual void print() = 0;
   virtual ~Base() {
      cout << "Base destructor\n";
   }
};

class Sub1 : public Base {

public:
   void print() {
      cout << "I am Sub1!\n";
   }
   ~Sub1() {
       cout << "Sub1 destructor\n";
   }
};

class Sub2 : public Base {

public:
   void print() {
      cout << "I am Sub2!\n";
   }
   ~Sub2() {
       cout << "Sub2 destructor\n";
   }
};

class App {

public: 
   App(Base *&b) {
      b = new Sub1;
      b = new Sub2;
   }
};


int main() {

   Base *b;
   b = NULL;

   App app(b);


 return 0;
 }

您的泄漏的最低修复是:

class App {

public: 
   App(Base *&b) {
      b = new Sub1;
      delete b;      // This is your only chance since the next statement overwrites the pointer.
      b = new Sub2;
   }
};


int main() {

   Base *b;
   b = NULL;

   App app(b);

   delete b;

   return 0;
}

但这似乎不是一个非常明智的计划。你真的需要弄清楚你想用 Sub1 和 Sub2 做什么。您不能让一个指针同时指向两个单独的对象。

此外,您最好学习使用 std::unique_ptr,因为它保留了它指向的内容的所有权,因此在适当的时候将其删除。

所以使用 std::unique_ptr 对代码的最小更改是:

class App {

public: 
   App(std::unique_ptr<Base> & b) {
      b.reset(new Sub1);
      b.reset(new Sub2);
   }
};


int main() {

   std::unique_ptr<Base> b;

   App app(b);

   return 0;
}

没有手动删除语句。而且没有内存泄漏。

(可能无用的 Sub1 问题仍然存在,但这是您必须弄清楚的设计问题,因为我不知道您最终希望您的程序实际做什么。)