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

dar*_*ven 0 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];
}
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 6

是的,这条线上有一个明确的错误.

_arrName[2]= '\0';
Run Code Online (Sandbox Code Playgroud)

_arrName是一个两个数组,char所以你只能使用这两个值_arrName[0]和_arrName[1]._arrName[2]超出范围.

此线路也存在问题.

virtual ~Base() { cout << "Base dtor of " << _name << endl; };
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Mattityahu Shmuel:只是因为编译和运行的东西并不一定意味着代码是正确的.许多形式的错误代码(包括这两种代码)都会导致_undefined behavior_.这意味着编译器不必诊断错误,但对程序可能执行的操作没有任何限制.字面上任何事情都可能发生 如果您很幸运,代码可能会崩溃,因此会给您一些警告,指出存在错误. (5认同)