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

字號:

在類生成臨時對象時,遇到一個問題,程序會兩次調(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)用它們,也防止了編譯器去生成它們。