删除动态分配的派生对象 - 多态
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 问题仍然存在,但这是您必须弄清楚的设计问题,因为我不知道您最终希望您的程序实际做什么。)
我不知道如何通过基指针删除动态分配的子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 问题仍然存在,但这是您必须弄清楚的设计问题,因为我不知道您最终希望您的程序实际做什么。)