以下代碼片段具有用戶定義的數據類型String
。該類的對象存儲字符指針str
(字符串的簡寫)和length
。在C++中調用析構函數
#include<iostream>
#include<cstring>
using namespace std;
class String
{
char* str;
int length;
public:
String(){} //default constructor
String(const char* s)
{
length=strlen(s);
str=new char[length+1];
strcpy(str,s);
}
void add(String a,String b) //function to concatenate strings
{
length=a.length+b.length;
str=new char[length+1];
strcpy(str,a.str);
strcat(str,b.str);
}
void display()
{
cout<<str<<endl;
}
~String() //destructor
{
delete str;
cout<<"Destructor invoked!";
}
};
int main()
{
String s1;
String s2("Well done!");
String s3("Boy");
s1.add(s2,s3);
s1.display();
s2.display();
s3.display();
}
輸出:
Destructor invoked!Destructor invoked!Well done!boy
X!!;
<!!;
Destructor invoked!Destructor invoked!Destructor invoked!
- 看來好像析構函數的
display
功能之前,甚至調用得到invoked.Why是這樣嗎?
如果不定義析構函數,我得到下面的輸出(如預期):
Well done!boy
Well done!
boy
- 爲什麼在定義一個析構函數這個意外的輸出?
析構函數被調用是因爲'add'的參數被銷燬。 – MikeCAT
你的班級不符合3級規則。您需要至少添加複製構造函數和複製賦值運算符。 –
你有兩個內存泄漏*和*雙重刪除。看看'add',和[三是什麼規則?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)。 – juanchopanza