在類生成臨時(shí)對(duì)象時(shí),遇到一個(gè)問題,程序會(huì)兩次調(diào)用析構(gòu)函數(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; //此處會(huì)報(bào)錯(cuò)
}
void dosth(stack pstk)
{
cout << pstk.data << endl;
}
int main()
{
stack str("iamxczhang");
dosth(str);
return 0;
}
查了一些資料,還不是很清楚,但是經(jīng)過仔細(xì)分析后,考試.大提示是系統(tǒng)調(diào)用默認(rèn)拷貝構(gòu)造函數(shù)的結(jié)果。
在返回對(duì)象和按值傳遞參數(shù)時(shí),要生成臨時(shí)對(duì)象,生成臨時(shí)對(duì)象要調(diào)用默認(rèn)拷貝構(gòu)造函數(shù)。
通過這個(gè)例子更讓加深了對(duì)Effective C++的理解。
只要類里有指針變量就得自己寫拷貝構(gòu)造函數(shù)和賦值函數(shù),但是你確定用不著這些函數(shù)時(shí),可以把這些函數(shù)做private聲明而不去實(shí)現(xiàn)它,這就防止了會(huì)有人去調(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; //此處會(huì)報(bào)錯(cuò)
}
void dosth(stack pstk)
{
cout << pstk.data << endl;
}
int main()
{
stack str("iamxczhang");
dosth(str);
return 0;
}
查了一些資料,還不是很清楚,但是經(jīng)過仔細(xì)分析后,考試.大提示是系統(tǒng)調(diào)用默認(rèn)拷貝構(gòu)造函數(shù)的結(jié)果。
在返回對(duì)象和按值傳遞參數(shù)時(shí),要生成臨時(shí)對(duì)象,生成臨時(shí)對(duì)象要調(diào)用默認(rèn)拷貝構(gòu)造函數(shù)。
通過這個(gè)例子更讓加深了對(duì)Effective C++的理解。
只要類里有指針變量就得自己寫拷貝構(gòu)造函數(shù)和賦值函數(shù),但是你確定用不著這些函數(shù)時(shí),可以把這些函數(shù)做private聲明而不去實(shí)現(xiàn)它,這就防止了會(huì)有人去調(diào)用它們,也防止了編譯器去生成它們。