下面的代碼給出了g ++版本4.6.2的一個例外,但是按照g ++版本4.2.1的預期運行。在執行過程中打印的消息表明,在這兩種情況下,一個析構函數正在被調用的地址是從未構建的。我想知道(a)哪些編譯器是正確的,(b)爲什麼某些東西在不被創建的情況下被銷燬。非常感謝。析構函數被調用的東西不是構造的
//------------------------------------------------------
#include <iostream>
using namespace std;
class Poly{
private:
float *coeff;
public:
Poly(){
coeff = NULL;
cout << "Created "<< this << endl;
}
Poly(Poly const & p){ // copy constructor
coeff = NULL;
cout << "Executed copy constructor.\n";
}
Poly operator=(Poly const & rhs){
cout << "Executed assignment. " << this << " = " << &rhs << endl;
}
Poly fun(){
Poly c;
return c;
}
~Poly(){
cout << "Destructor: " << this << endl;
delete[] coeff;
}
};
main(){
Poly a;
a = a.fun();
}
//------------------------------------------------------
對於G ++ 4.6.2它給和異常:
% ./a.out
Created 0xbfdcc184
Created 0xbfdcc18c
Executed assignment. 0xbfdcc184 = 0xbfdcc18c
Destructor: 0xbfdcc188
*** glibc detected *** free(): invalid pointer: 0xbfdcc1a8 ***
Aborted
對於G ++ 4.2.1它下面
% ./a.out
Created 0x7fff5fbff930
Created 0x7fff5fbff920
Executed assignment. 0x7fff5fbff930 = 0x7fff5fbff920
Destructor: 0x7fff5fbff910
Destructor: 0x7fff5fbff920
Destructor: 0x7fff5fbff930
沒有例外,並用更多的代碼它確實會產生正確的答案。但是,它似乎破壞了從未構建過的0x7fff5bff910。請注意,複製構造函數永遠不會被調用,它會打印出一條消息。
您可以確保您發佈了您正在使用的確切代碼。沒有返回類型的'main'應該會產生一個編譯錯誤。 – 2012-02-19 11:50:08
...對於那些認爲在NULL上調用'delete []'是錯誤的人:**「在任何一種替代[delete和delete []]中,如果delete的操作數的值是空指針,則操作沒有任何效果。「** – LihO 2012-02-19 12:01:18