如果我有一个在堆栈上创建STL
对象并将它们添加到堆栈的函数。例如,假设我在堆栈上创建std::pair
并将它们添加到堆上创建的std::queue
。现在,如果我在队列外部传递队列,那么将队列作为参数的不同函数可以访问std::pair
个对象。
答案 0 :(得分:2)
取决于您不提及的一些因素。
要检查的第一件事是您是将对象复制到队列中,还是将指向对象的指针复制到队列中。以下是每个例子。
A
如果它存储了对象的副本,那么有权访问该队列的任何东西都可以毫无问题地访问该对象。如果它存储指针,则取决于该堆栈帧是否已被回收。如果堆栈帧不受影响,访问该内存将没问题。否则,该值将是垃圾。
法律示例:
函数std::queue Q
将指向堆栈分配对象的指针添加到Q
,然后将B
传递给函数A
。由于函数B
尚未返回,因此函数Q
可以毫无问题地访问A
中的对象。
垃圾示例:
函数std::queue Q
将指向堆栈分配对象的指针添加到Q
,然后将B
返回到其调用函数A
。由于函数B
已返回,如果函数Q
尝试访问{{1}}中的对象,则会收到垃圾。
答案 1 :(得分:1)
当push
std::pair
中的std::queue
对象(queue
)时,它会从本地范围复制到queue
。因此,当本地对象超出范围并被删除时,emplace
中的副本仍然有效,直到队列本身被删除。
由于旁注会比push
更喜欢std::pair
,因为它会在queue
中构建byte[] dataAsBytes = Items.SelectMany(s =>
System.Text.Encoding.UTF8.GetBytes(s + Environment.NewLine)).ToArray();
而不是复制。
答案 2 :(得分:0)
是的,因为当您将堆栈中的对象“添加”到堆中的对象时,您将复制堆栈中的信息到“堆”。