簡體   English   中英

有問題的代碼??? 我的析構函數有問題嗎?

[英]Problematic code??? Is there a problem with my 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];
}

是的,這條線上肯定有錯誤。

_arrName[2]= '\0';

_arrName是兩個char的數組,因此您只能使用_arrName[0]_arrName[1]這兩個值。 _arrName[2]超出范圍。

這條線也有問題。

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

因為派生類已將_name指向派生類的數組成員,所以在調用_name ~Base() ,此數組將被銷毀,並且_name將不再指向有效數組。

基類中有可能出錯。 _name從未被初始化,因此它依賴於派生類對其進行初始化。 盡管實際上可能會或可能不會引起實際問題,但這並不是理想的設計。

您的代碼沒有錯。 可能是因為您沒有縮進代碼,這使它的閱讀難度提高了100倍。

但是,我建議您使用std :: string而不是普通的C樣式字符串。 它使您的工作更加輕松。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM