在類生成臨時對象時,遇到一個問題,程序會兩次調(diào)用析構函數(shù)
#include
#include
using namespace std;
class stack
{
public:
stack(const char *value);
~stack();
char * data;
};
stack::stack(const char *value)
{
if(value)
{
data = new char[strlen(value)+1];
strcpy(data,value);
}
else
{
data = new char[1];
*data = '\0';
}
}
inline stack::~stack()
{
cout << "Destructor" << endl;
//delete []data; //此處會報錯
}
void dosth(stack pstk)
{
cout << pstk.data << endl;
}
int main()
{
stack str("iamxczhang");
dosth(str);
return 0;
}
查了一些資料,還不是很清楚,但是經(jīng)過仔細分析后,考試.大提示是系統(tǒng)調(diào)用默認拷貝構造函數(shù)的結果。
在返回對象和按值傳遞參數(shù)時,要生成臨時對象,生成臨時對象要調(diào)用默認拷貝構造函數(shù)。
通過這個例子更讓加深了對Effective C++的理解。
只要類里有指針變量就得自己寫拷貝構造函數(shù)和賦值函數(shù),但是你確定用不著這些函數(shù)時,可以把這些函數(shù)做private聲明而不去實現(xiàn)它,這就防止了會有人去調(diào)用它們,也防止了編譯器去生成它們。
#include
#include
using namespace std;
class stack
{
public:
stack(const char *value);
~stack();
char * data;
};
stack::stack(const char *value)
{
if(value)
{
data = new char[strlen(value)+1];
strcpy(data,value);
}
else
{
data = new char[1];
*data = '\0';
}
}
inline stack::~stack()
{
cout << "Destructor" << endl;
//delete []data; //此處會報錯
}
void dosth(stack pstk)
{
cout << pstk.data << endl;
}
int main()
{
stack str("iamxczhang");
dosth(str);
return 0;
}
查了一些資料,還不是很清楚,但是經(jīng)過仔細分析后,考試.大提示是系統(tǒng)調(diào)用默認拷貝構造函數(shù)的結果。
在返回對象和按值傳遞參數(shù)時,要生成臨時對象,生成臨時對象要調(diào)用默認拷貝構造函數(shù)。
通過這個例子更讓加深了對Effective C++的理解。
只要類里有指針變量就得自己寫拷貝構造函數(shù)和賦值函數(shù),但是你確定用不著這些函數(shù)時,可以把這些函數(shù)做private聲明而不去實現(xiàn)它,這就防止了會有人去調(diào)用它們,也防止了編譯器去生成它們。

