簡體   English   中英

構造后,成員對象的地址立即更改

[英]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.

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