访问函数外部的堆栈对象

时间:2015-10-16 13:59:32

标签: c++ stl heap-memory stack-memory

如果我有一个在堆栈上创建STL对象并将它们添加到堆栈的函数。例如,假设我在堆栈上创建std::pair并将它们添加到堆上创建的std::queue。现在,如果我在队列外部传递队列,那么将队列作为参数的不同函数可以访问std::pair个对象。

3 个答案:

答案 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)

是的,因为当您将堆栈中的对象“添加”到堆中的对象时,您将复制堆栈中的信息到“堆”。