我无法弄清楚如何通过basepointer删除动态分配的子类。分配在App-class中,如何使用main方法删除已分配的对象?
#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;
}
答案 0 :(得分:2)
泄密的最低限度是:
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问题仍然存在,但这是一个你必须弄清楚的设计问题,因为我不知道你希望你的程序最终实际做什么。)