2015-10-16 102 views
0

如果我有一個函數在堆棧上創建一個STL對象並將它們添加到堆棧中。例如,假設我在堆棧上製作std::pair,並將它們添加到在堆上製作的std::queue。現在,如果我將該隊列傳遞到該函數之外,那麼可以使用隊列作爲參數的另一個函數訪問std::pair對象。在函數外訪問堆棧對象

+0

複製東西通常不會影響某些東西。 –

+1

如果您發佈[最小化,完整和可驗證的示例](http://stackoverflow.com/help/mcve),它將變得如此簡單。 –

回答

2

取決於你沒有提到的幾個因素。

首先要檢查的是您是將對象複製到隊列中還是將指向該對象的指針複製到隊列中。這裏是每個例子。

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中的對象時收到垃圾。

+0

你確定是這樣,因爲這個答案與前兩個完全相反。 – Antithesis

+0

另外兩個正在討論價值類型(副本)。我將添加一個簡短的片段來展示它們之間的差異。 –

0

是的,因爲當你將堆棧中的對象「添加」到堆中的對象時,你將執行駐留在堆棧上的信息到「堆」的副本。

1

當您push對象(std::pair)在std::queuestd::queue它從本地範圍複製到queue。因此,當本地對象超出範圍並被刪除時,它的副本queue仍然有效,直到隊列本身被刪除。

作爲旁註,我更喜歡emplace而不是push,因爲它會在queue中構建std::pair而不是複製。