问题代码???我的析构函数有问题吗?

时间:2010-10-03 09:18:07

标签: c++ destructor

我的代码编译并运行,但我被告知这是非常有问题的。我不明白我哪里出错了。

此外,声称“char _arrName [2];”并不是错误的。并做作业“_arrName [2] ='\ 0';” ?是不是一个“超出界限”的错误?

#include <iostream>
using namespace std;
class Base {
protected:
char* _name;
public:
virtual ~Base() { cout << "Base dtor of " << _name << endl; };
};
class D1: public Base {
char _arrName[2];
public:
D1() {
_name= _arrName;
_arrName[0]= 'D';
_arrName[1]= '1';
_arrName[2]= '\0';
}
virtual ~D1() { cout << "D1 dtor" << endl; }
};
int main () {
Base* arr[2];
arr[0]= new D1();
delete arr[0];
}

2 个答案:

答案 0 :(得分:6)

是的,这一行确实存在错误。

_arrName[2]= '\0';

_arrName是一个包含两个char的数组,因此您只能使用两个值_arrName[0]_arrName[1]_arrName[2]超出范围。

此行也存在问题。

virtual ~Base() { cout << "Base dtor of " << _name << endl; };

因为派生类指向_name指向派生类的数组成员,所以在调用~Base()时,此数组将被销毁,_name将不再存在指向一个有效的数组。

基类中可能存在错误。 _name永远不会被初始化,因此它依赖于初始化它的派生类。这不是理想的设计,但在实践中它可能会或可能不会导致真正的问题。

答案 1 :(得分:-3)

您的代码没有任何问题。也许是因为你没有缩进你的代码,这使得它更难以阅读。

虽然,我建议你使用std :: string而不是普通的C风格字符串。它使你的工作更容易。