访问函数外部的堆栈对象
Accessing stack objects outside a function
如果我有一个函数在堆栈上创建一个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);
}
如果它存储对象的副本,那么任何可以访问队列的对象都可以毫无问题地访问该对象。如果它存储指针,则取决于该stackframe是否已被回收。如果stackframe未被触及,则访问该内存将是正常的。否则,该值将是垃圾。
法律的例子:函数A
向std::queue Q
添加一个指向堆栈分配对象的指针,然后将Q
传递给函数B
。因为函数A
还没有返回,函数B
可以毫无问题地访问Q
中的对象。
垃圾的例子:函数A
向std::queue Q
添加一个指向堆栈分配对象的指针,然后将Q
返回给调用它的函数B
。由于函数A
已经返回,如果函数B
试图访问Q
中的对象,它将接收到垃圾。
当您在std::queue
中push
对象(在您的情况下是std::pair
)时,它从本地作用域复制到queue
。因此,当本地对象超出作用域并被删除时,它在queue
中的副本仍然有效,直到队列本身被删除。
作为旁注,emplace
优于push
,因为它将在queue
中构建std::pair
,而不是复制。
是的,因为当你从堆栈中"添加"对象到堆中的对象时,你会将驻留在堆栈中的信息复制到"堆"中。
相关文章:
- 作为指针注入类后重新创建堆栈对象不好吗?
- 堆分配对象中的堆栈对象在 c++ 中在哪里分配?
- 模板堆栈对象的数组;语法
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 堆栈对象的强制转换指针
- 指向堆栈对象的指针是否在超出范围时被删除
- 重建堆栈对象
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 堆栈对象"lost"会发生什么情况?
- 对 stl 堆栈对象大小的限制
- 堆栈对象"delete"的行为是什么?
- 为什么异常总是在具有可破坏堆栈对象的非叶函数中产生开销
- 是否可以为 CString 返回堆栈对象以及为什么 /GR 导致未定义的行为dynamic_cast
- 何时构造函数调用中的堆栈对象
- C++堆栈对象的构造函数异常处理
- 将没有成员的函子设置为类成员对象还是堆栈对象更有效
- 堆栈对象的动态强制转换失败
- 堆栈对象的最大大小
- 为什么我的堆栈对象在创建后会更改默认值
- 指向没有所有权的堆栈对象的指针