[英]The address of a member object is changing immediately after constructor
如果您想查看導致此問題的代碼,可以在此處查看和克隆項目: https : //github.com/NickChapman/RuM/tree/63047e457745558403ea807534e4f5b9930cfeb8
值得注意的是,在我擁有的構造函數中( RuMParser.cpp
第20行):
this->globalScope = Scope();
std::cout << &(this->globalScope) << std::endl;
然后在構造函數完成后,我立即擁有( RuM.cpp
第63行):
std::cout << &(this->parser.globalScope) << std::endl;
這些的輸出是:
0x7fff57ac5318
0x7fff57ac6988
為什么它們不一樣? 在所有其余時間中,地址將保持固定為第二個值。 為什么離開構造函數后會發生變化?
在第一次打印后立即嘗試建立指針時,我注意到了這個問題。 指針指向構造函數完成后的第二個更舊的地址,我對為什么感到困惑。
我懷疑這與副本構造函數有關,或者與之類似。
編輯:作為參考,如果您嘗試構建源代碼並運行,則可以:
cmake .
make
然后
./rum
輸入x=1;$
將導致程序出現段錯誤。
this->parser = RuMParser(tokenList);
std::cout << &(this->parser.globalScope) << std::endl;
首先,將創建一個臨時的RuMParser
,這是您獲得第一張印刷品的時間。 然后將臨時副本復制到this->parser
。 這意味着, globalScope
將再次默認構造。 因此在以后的打印中將顯示不同的地址。
好的,代碼中有很多可疑/非慣用的東西,但是我將只堅持對這個問題重要的事情。 您可以將構造函數重寫為:
RuMInterpreter::RuMInterpreter():
tokenList(std::make_shared<std::vector<Token>>())
,parser(tokenList)
{
....
}
盡可能始終選擇成員初始化器列表。 我猜這也是有效的C ++書中的內容之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.