C++技巧(兩次調(diào)用析構(gòu)函數(shù))

字號(hào):

在類生成臨時(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)用它們,也防止了編譯器去生成它們。