2015-10-16 101 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而不是复制。