[問題] VC的constructor 呼叫了 destructor?

作者: donkeychen (Bad_To_The_Bone)   2014-09-22 15:53:02
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
在Programming版問了如何trace code的開始與結束的時候
版上大大提供
宣告一個物件 建構子的時候印出開始符號 解構子的時候印出結束符號
進function就宣告此物件
在BCB測試順利
在VC下 建構子一呼叫完解構子就被呼叫
預期的正確結果(Expected Output):
line1 (表示開始)
line2 (表示function內容)
line3 (表示結束)
錯誤結果(Wrong Output):
line1
line3
line2
line3
程式碼(Code):(請善用置底文網頁, 記得排版)
.h
#include <iostream>
using namespace std;
struct BEGINEND
{
public:
BEGINEND(char* file, int line, wstring str);
~BEGINEND(void);
private:
char *file_;
int line_;
wstring str_;
};
=========================================================
.cpp
#include "stdafx.h"
#include "test.h"
#include <iostream>
using namespace std;
BEGINEND::BEGINEND(char* file, int line, wstring str)
{
void* ptr;
ptr = this;
file_ = file;
line_ = line;
str_ = str;
{
cout << "line1" << endl;
}
}
BEGINEND::~BEGINEND(void)
{
void* ptr;
ptr = this;
cout << "line3" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
BEGINEND be = BEGINEND(__FILE__, __LINE__, L"haha");
cout << "line2" << endl;
return 0;
}
補充說明(Supplement):
錯誤輸出的情況我有試著把this印出
結果
line1
line3
lien2
line3
紅色兩行的this與綠色行的this不同個
想請教一下這情況是哪邊出問題了呢
謝謝
作者: CindyLinz (Cindy Wang)   2014-09-22 16:02:00
覺得紅色部分是 BEGINEND(__FILE__...) 的生和滅然後 be = 是從 copy constructor 建立 be, 所以呼叫到沒有 line1 的 constructor, 就沒印 line1 了最後面綠色是 be 的毀滅
作者: azureblaze (AzureBlaze)   2014-09-22 16:18:00
要弄這種東西建議用 X a(args...); 這種方式
作者: CindyLinz (Cindy Wang)   2014-09-22 17:02:00
不過 VC++ 這行為有一點怪, 你要不要附一下版本? ^^|
作者: donkeychen (Bad_To_The_Bone)   2014-09-22 17:09:00
喔喔 感謝AZ大 跟CI大....2005的^^;改AZ大的宣告可以正常了 不會有紅色的LINE3
作者: CindyLinz (Cindy Wang)   2014-09-22 17:14:00
我用 g++ 試類似的寫法, 是會自動變成 azureblaze 講的效果.. 而且 optimize 都關了, 用 -O0 也是.. @@"g++ 4.8.2
作者: azureblaze (AzureBlaze)   2014-09-22 17:32:00
gcc似乎要-fno-elide-constructors才關得掉
作者: donkeychen (Bad_To_The_Bone)   2014-09-22 18:43:00
原來是compiler的行為~
作者: suhorng ( )   2014-09-22 19:33:00
噢~所以問題解決了? 還沒回你信XD感覺應該如二樓所說, 是呼叫 copy constructor所以還有臨時物件的建構解構吧 (不太熟, 不敢亂說XD)
作者: donkeychen (Bad_To_The_Bone)   2014-09-23 11:29:00
感謝大大^^

Links booklink

Contact Us: admin [ a t ] ucptt.com