如果我有一个函数在堆栈上创建一个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);
}
如果它存储的对象的副本,然后进入队列什么都可以访问该对象没有问题。如果它存储指针,则取决于该堆栈帧是否已被回收。如果堆栈未触及,访问该内存就没问题。否则,该值将是垃圾。
法律例如: 功能A
添加一个指向堆栈中分配对象到std::queue Q
,然后传递Q
起作用B
。由于功能A
尚未返回,因此功能B
可以访问Q
中的对象而没有问题。
垃圾例如: 功能A
添加一个指向堆栈中分配对象到std::queue Q
,然后返回到Q
其调用函数B
。由于函数A
已返回,函数B
将尝试访问Q
中的对象时收到垃圾。
你确定是这样,因为这个答案与前两个完全相反。 – Antithesis
另外两个正在讨论价值类型(副本)。我将添加一个简短的片段来展示它们之间的差异。 –
是的,因为当你将堆栈中的对象“添加”到堆中的对象时,你将执行驻留在堆栈上的信息到“堆”的副本。
当您push
对象(std::pair
)在std::queue
std::queue
它从本地范围复制到queue
。因此,当本地对象超出范围并被删除时,它的副本queue
仍然有效,直到队列本身被删除。
作为旁注,我更喜欢emplace
而不是push
,因为它会在queue
中构建std::pair
而不是复制。
- 1. 函数外的访问对象
- 2. JVM堆栈访问
- 3. 访问堆栈帧
- 4. 堆栈上的对象意外删除
- 5. 对象分配在堆栈或堆C++
- 6. 使用C#反射访问堆栈跟踪对象
- 7. 修改堆栈的顶部而不访问StackType对象
- 8. 访问Java调用堆栈
- 9. 汇编堆栈访问
- 10. 访问Java堆栈帧
- 11. 在函数中创建的对象,是保存在堆栈还是堆上?
- 12. 哪个更快访问堆栈或堆?
- 13. Python是否有静态对象,堆栈对象和堆对象?
- 14. 在Python中嵌入函数之外访问对象
- 15. 如何在angularjs中承诺函数外访问对象
- 16. Java堆栈和对象
- 17. 堆栈对象的C++ shared_ptr
- 18. 在函数堆栈中的JavaScript内部记录函数/对象名称的函数栈
- 19. 受保护的堆对象堆栈vs堆栈分配
- 20. 我们可以从函数名称访问堆栈帧指针
- 21. 在堆栈顶部访问UINavigationController
- 22. 堆栈或堆上的对象分配
- 23. 堆栈/堆上的对象创建?
- 24. 调用堆栈上大对象的构造函数
- 25. C++堆栈分配对象,显式析构函数调用
- 26. 函数调用中的堆栈对象何时构建?
- 27. 访问外部对象
- 28. 用JavaScript函数参数访问对象
- 29. React导航嵌套堆栈,访问根堆栈
- 30. 在堆栈上处理对象破坏
复制东西通常不会影响某些东西。 –
如果您发布[最小化,完整和可验证的示例](http://stackoverflow.com/help/mcve),它将变得如此简单。 –