首先讓我說我目前對 C 非常陌生——我以前只真正使用過 python 和 javascript(對 python 有很多接觸),所以,現在我正在學習 C 以擴展我的知識和了解較低級別的編程概念,我想在這里伸出手并提出一個具體問題。
當然,使用 python 我根本不需要擔心記憶體分配、物件復制、值/參考傳遞等。它是一個全新的世界!(非常令人興奮:D)
我最好的學習方式是邊做邊學,所以我創建了一個相對簡單的區塊鏈概念證明。
我不會在這里粘貼我所有的代碼,因為它已經有相當數量了,但我想檢查的是具體是如何處理物件副本的。
到目前為止,我在我的代碼中沒有通過 new/delete 或 shared_ptr/make_shared 使用任何動態記憶體分配,如果我理解正確,我的所有物件都在堆疊上創建 - 因此一旦物件退出范圍,這將被自動銷毀(這是對的嗎?)。
讓我在這里提供一個例子并解釋我的具體問題是什么。考慮以下代碼塊:
void Blockchain::AddBlock(Block bBlock)
{
if (bBlock.ValidateBlock(_vChain))
{
_vChain.push_back(bBlock);
cout << "Chain Length: " << _vChain.size() << endl;
}
else
{
throw Exceptions::ValidationError();
}
}
void Blockchain::AddTransaction(Transaction &tTransaction)
{
cout << "Adding Transaction to block number " << _vChain.size() 1 << endl;
bool IsValidated = _ValidateTransaction(tTransaction);
if (!IsValidated)
{
cout << "... not valid" << endl;
}
else
{
// cout << "Valid";
int ChainLength = _vTransaction.size();
if (ChainLength < BlockchainConstants::MAX_BLOCK_SIZE)
{
_vTransaction.push_back(tTransaction);
}
else
{
uint32_t NewIndex = _vChain.size();
Block NextBlock = Block(NewIndex, _vTransaction);
NextBlock.sPrevHash = GetLastBlock().GetHash();
AddBlock(NextBlock);
_vTransaction.clear();
_vTransaction.push_back(tTransaction);
}
}
}
同樣,如果我理解正確的話,在我撰寫的上述代碼塊中,一旦事務池達到其最大容量(從而觸發 else 條件),我將基于事務池創建一個塊物件,并且索引,這是第一個實體。當我打電話時,AddBlock()我按值傳遞物件,從而創建物件的副本。在AddBlock()方法中,我正在驗證塊,并再次將物件推回向量中_vChain(再次創建副本)。我的問題是,在整個程序結束時,我是否只剩下一個物件?我的假設是,創建的第一個物件在 else 條件結束時被破壞,AddTransaction()第二個副本在 結束時被破壞,AddBlock()在向量中只剩下物件的 1 個實體_vChain.
我的想法在這里正確嗎?對于這個長問題,我很抱歉,我只是想確保我在這里為你們提供了所有詳細資訊 - 如果還有什么需要幫助我的,請告訴我。將不勝感激任何幫助!
干杯
uj5u.com熱心網友回復:
你的問題有點不清楚,因為我不確定你為什么想知道那里有多少份。如果您想了解更明確的問題,請編輯您的問題。我在這里聞到了XY 問題。
您需要知道的是變數 scope。
我假設這里_vChain是一個類成員或全域變數,因此如果傳入驗證,_vChain將會有一個副本。離開函式后,輸入引數將被銷毀。bBlockAddBlock()
如果要查看行為,最簡單的方法是std::cout在建構式和解構式中都放置以跟蹤 的構造和銷毀Block。
另外我建議在這個串列中挑選一本初級程式員的書。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402520.html
標籤:
