簡體   English   中英

為什么構造函數調用的數量與析構函數調用的數量不匹配?

[英]Why does the number of constructor calls not match with the number of destructor calls?

我對以下代碼感到非常困惑。

#include <iostream>

class mobject
{
public:
    mobject(){ std::cout << "mobject ctor\n"; }
    ~mobject(){ std::cout << "mobject dtor\n"; }
};

mobject giveme() { return mobject(); }
void func2(const mobject& p) { mobject g = p; }
void func1(const mobject& p) { func2(p); }
int main()
{
    func1(giveme());
    return 0;
}

它給了我以下輸出:

mobject ctor
mobject dtor
mobject dtor

我用gcc 5.4.0的“ g ++ -g temp.cpp”編譯了代碼。 我主要關心的是第二次調用mobjects的析構函數。 這看起來很不對勁,因為我們第二次打電話給dtor。 valgrind告訴我這沒什么問題,但我仍然感到困惑。

您的代碼構造了兩個mobjects ,一個是默認構造的,另一個是副本構造的,但是您只在默認構造函數中放置了一條打印消息,而忽略了該拷貝構造函數。 還請注意,您的函數調用與手頭的問題無關:

#include <iostream>

struct mobject
{
    mobject(const mobject& /* other */){ std::cout << "mobject copy-ctor\n"; }
    mobject(){ std::cout << "mobject ctor\n"; }
    ~mobject(){ std::cout << "mobject dtor\n"; }
};

int main()
{
  const mobject& p = mobject();
  mobject g = p;
}

這使:

mobject ctor
mobject copy-ctor
mobject dtor
mobject dtor

mobject dtor兩行輸出是由於以下原因:

  • 當您在func1(giveme());行的main中調用giveme()函數時,將創建第一個對象func1(giveme()); 程序結束時,這將給出輸出mobject dtor的第三行。
  • 第二個對象是使用行mobject g = p; default-copy-constructor創建的mobject g = p; 函數func2 輸出mobject dtor第二行是從此函數返回刪除該對象時。

以下修改的代碼和相應的輸出將演示它:

class mobject
{
public:
    mobject(const mobject& ob){ cout << "mobject overridden-copy-constructor\n"; }
    mobject(){ cout << "mobject ctor\n"; }
    ~mobject(){ cout << "mobject dtor\n"; }
};

mobject giveme() 
{ 
    cout << "1. In Function: "<<__func__<<endl;
    return mobject(); 
}
void func2(const mobject& p) 
{ 
    cout << "2. In Function: "<<__func__<<endl;
    mobject g = p; 
    cout << "3. In Function: "<<__func__<<endl;
}
void func1(const mobject& p) 
{ 
    cout << "4. In Function: "<<__func__<<endl;
    func2(p); 
    cout << "5. In Function: "<<__func__<<endl;
}
int main()
{
    cout << "6. In Function: "<<__func__<<endl;
    func1(giveme());
    cout << "7. In Function: "<<__func__<<endl;
    return 0;
}

輸出值

6. In Function: main
1. In Function: giveme
mobject ctor
4. In Function: func1
2. In Function: func2
mobject overridden-copy-constructor
3. In Function: func2
mobject dtor
5. In Function: func1
mobject dtor
7. In Function: main

看到這里工作代碼吧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM