如果我有一個函數在堆棧上創建一個STL
對象並將它們添加到堆棧中。例如,假設我在堆棧上製作std::pair
,並將它們添加到在堆上製作的std::queue
。現在,如果我將該隊列傳遞到該函數之外,那麼可以使用隊列作爲參數的另一個函數訪問std::pair
對象。在函數外訪問堆棧對象
回答
取決於你沒有提到的幾個因素。
首先要檢查的是您是將對象複製到隊列中還是將指向該對象的指針複製到隊列中。這裏是每個例子。
std::queue<A> copyQueue;
std::queue<A*> pointerQueue;
void addCopy(A a) {
copyQueue.add(a);
}
void addPointer(A a) {
pointerQueue.add(&a);
}
如果它存儲的對象的副本,然後進入隊列什麼都可以訪問該對象沒有問題。如果它存儲指針,則取決於該堆棧幀是否已被回收。如果堆棧未觸及,訪問該內存就沒問題。否則,該值將是垃圾。
法律例如: 功能A
添加一個指向堆棧中分配對象到std::queue Q
,然後傳遞Q
起作用B
。由於功能A
尚未返回,因此功能B
可以訪問Q
中的對象而沒有問題。
垃圾例如: 功能A
添加一個指向堆棧中分配對象到std::queue Q
,然後返回到Q
其調用函數B
。由於函數A
已返回,函數B
將嘗試訪問Q
中的對象時收到垃圾。
你確定是這樣,因爲這個答案與前兩個完全相反。 – Antithesis
另外兩個正在討論價值類型(副本)。我將添加一個簡短的片段來展示它們之間的差異。 –
是的,因爲當你將堆棧中的對象「添加」到堆中的對象時,你將執行駐留在堆棧上的信息到「堆」的副本。
當您push
對象(std::pair
)在std::queue
std::queue
它從本地範圍複製到queue
。因此,當本地對象超出範圍並被刪除時,它的副本queue
仍然有效,直到隊列本身被刪除。
作爲旁註,我更喜歡emplace
而不是push
,因爲它會在queue
中構建std::pair
而不是複製。
- 1. 堆棧上的對象意外刪除
- 2. 使用C#反射訪問堆棧跟蹤對象
- 3. 訪問Java調用堆棧
- 4. 在函數中創建的對象,是保存在堆棧還是堆上?
- 5. Python是否有靜態對象,堆棧對象和堆對象?
- 6. 在Python中嵌入函數之外訪問對象
- 7. 如何在angularjs中承諾函數外訪問對象
- 8. 在函數堆棧中的JavaScript內部記錄函數/對象名稱的函數棧
- 9. 堆棧或堆上的對象分配
- 10. 堆棧/堆上的對象創建?
- 11. 在堆棧頂部訪問UINavigationController
- 12. 調用堆棧上大對象的構造函數
- 13. 函數調用中的堆棧對象何時構建?
- 14. C++堆棧分配對象,顯式析構函數調用
- 15. 訪問外部對象
- 16. 用JavaScript函數參數訪問對象
- 17. React導航嵌套堆棧,訪問根堆棧
- 18. 在堆棧中創建對象
- 19. 一般問題:Java有堆和本地堆棧。你能訪問堆中的任何對象嗎?
- 20. 從嵌套函數訪問外部對象(使用backbone.js
- 21. 訪問外部對象從jQuery的回調函數
- 22. 訪問外部回調函數的這個對象
- 23. 堆棧中的對象vs C++堆中的對象
- 24. jQuery bug,slidetoggle()函數堆棧
- 25. MEAN堆棧更新函數
- 26. 堆棧應該如何使用大對象堆棧?
- 27. 對象的堆棧上或堆棧上的隱藏成員?
- 28. 併發訪問,並免費堆對象
- 29. 構造函數和對象 - 訪問
- 30. 從Wordpress函數訪問PHP對象
複製東西通常不會影響某些東西。 –
如果您發佈[最小化,完整和可驗證的示例](http://stackoverflow.com/help/mcve),它將變得如此簡單。 –