use*_*833 2 c++ virtual memory-management new-operator
我正在一个应用程序中编写一个实用程序类,在这个应用程 我没有任何虚函数(使用虚拟dtors的一般准则),所以考虑到我的内存限制,我选择在这个实用程序类中没有虚拟析构函数.
一些程序员后来 - 有人通过派生来增加我的实用程序类.现在,如果在代码中的任何地方,我的新类new'd和删除正确的dtor将不会被调用,因为基类dtor不是虚拟的(参见示例代码).
除了返回并更改基类之外 - 在这种情况下有什么解决方案?
#include <iostream>
using namespace std;
class utility {
int i, j;
public:
utility () { cout << "utility ctor\n";};
~utility () { cout << "utility dtor\n";};
void dosomething () { cout << "haha\n";};
};
class addtoutility: public utility {
char *ch;
public:
addtoutility () { ch= new char(); cout << "added ctor\n";};
~addtoutility () { delete ch; cout << "added dtor\n";};
void andnowaddsomefunctionality () {};
};
int main () {
utility *u = new addtoutility();
//lots of interesthing code
delete u;
}
Run Code Online (Sandbox Code Playgroud)
你的基类不是多态的,所以在任何情况下都有一个指向基类的价值.您的基类通过不在virtual任何地方使用关键字来记录它不是多态的事实.
如果有人想将它用作多态层次结构的基类,那么他们可以将virtual析构函数添加到它们从中派生的第一个类中,并在必要时保存指向该基类类型的指针.
你不能阻止后来的程序员挖掘他们自己的陷阱,但非多态的类没有任何问题,你不需要做任何事情来"保证安全".
作为这是常见且可接受的实践的证据,您只需要查看标准库.有许多类(严格来说,大多数是类模板),没有虚函数,也没有虚析构函数.
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |