我的代码编译并运行,但我被告知这是非常有问题的。我不明白我哪里出错了。
此外,声称“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];
}
答案 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风格字符串。它使你的工作更容易。