如果我有一个函数在堆栈上创建一个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. 使用C#反射访问堆栈跟踪对象
- 3. 访问Java调用堆栈
- 4. 在函数中创建的对象,是保存在堆栈还是堆上?
- 5. Python是否有静态对象,堆栈对象和堆对象?
- 6. 在Python中嵌入函数之外访问对象
- 7. 如何在angularjs中承诺函数外访问对象
- 8. 在函数堆栈中的JavaScript内部记录函数/对象名称的函数栈
- 9. 堆栈或堆上的对象分配
- 10. 堆栈/堆上的对象创建?
- 11. 在堆栈顶部访问UINavigationController
- 12. 调用堆栈上大对象的构造函数
- 13. 函数调用中的堆栈对象何时构建?
- 14. C++堆栈分配对象,显式析构函数调用
- 15. 访问外部对象
- 16. 用JavaScript函数参数访问对象
- 17. React导航嵌套堆栈,访问根堆栈
- 18. 在堆栈中创建对象
- 19. 一般问题:Java有堆和本地堆栈。你能访问堆中的任何对象吗?
- 20. 从嵌套函数访问外部对象(使用backbone.js
- 21. 访问外部对象从jQuery的回调函数
- 22. 访问外部回调函数的这个对象
- 23. 堆栈中的对象vs C++堆中的对象
- 24. jQuery bug,slidetoggle()函数堆栈
- 25. MEAN堆栈更新函数
- 26. 堆栈应该如何使用大对象堆栈?
- 27. 对象的堆栈上或堆栈上的隐藏成员?
- 28. 并发访问,并免费堆对象
- 29. 构造函数和对象 - 访问
- 30. 从Wordpress函数访问PHP对象
复制东西通常不会影响某些东西。 –
如果您发布[最小化,完整和可验证的示例](http://stackoverflow.com/help/mcve),它将变得如此简单。 –