在引用返回后从内存中删除
Deleteing from memory after reference has returned
我有一个关于在c++中从内存中删除东西的问题,以及什么将不再存在。如果我在c++(标准库)中创建一个队列,向其添加两个元素,然后调用front(),将其存储在一个常规变量中(没有指针)。然后在队列上调用pop()。我存储的变量仍然存在,对吧?如果有人编辑了队列中指针所在的内存地址,会发生什么?这是否意味着我之前存储的局部变量不再有效,因为它是从引用创建的?
谢谢你的解释
假设您不是在队列中存储指针,而是实际值或对象,那么当您将front()存储到一个常规变量时,您实际上在做的是复制(如果它是一个对象,则将调用实际的复制构造函数)。当你pop()队列的元素时,复制不会被影响。
我试着用代码回答:
#include <queue>
#include <iostream>
int main()
{
// "Q: If I create a queue in C++..."
std::queue<int> q;
// "...add two elements to it..."
q.push(42);
q.push(1729);
// "...then call front(), store it in a regular variable (no pointer)..."
int i = q.front();
// "...Then I call pop() on the queue..."
q.pop();
// ...The variable i stored will still exist right?"
// A: "Yes, of course! And it retained its value:"
std::cout << i << std::endl;
}
此外:"如果有人编辑了队列中指针所在的内存地址,会发生什么?"
没有在队列中存储指针(见上文)!无论如何,如果你的意思是"如果存储队列弹出元素的内存区域被释放或覆盖会发生什么",答案是我们在i
中存储了该对象的副本,而i
位于完全不同的内存区域。
"这是否意味着先前存储的局部变量
i
不再有效,因为它是从引用创建的?"
不,它仍然有效,因为即使它是从通过front()
的返回值引用的对象分配的,我们也对该对象进行了复制 !
如果您使用front()存储它,然后弹出它,那么您的对象将不再存在(假设您使用STL中的队列)
这是因为front()通过引用而不是复制返回所包含的对象。
相关文章:
- 迭代时从向量和内存中删除对象
- 为什么示例代码访问IUnknown中已删除的内存
- 我们可以删除链表中静态内存中的节点吗
- 在c++中删除内存失败
- 如何在cpp中删除(免费)多维结构内存?
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 一种从内存中删除 UTF 字节的方法?
- 内存泄漏如何查找和删除
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 无法删除布尔动态内存分配
- 删除类成员的动态分配内存的最佳方法是什么
- 如何控制或优化或删除或释放 UNION 中未使用的内存
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 为什么删除分配的阵列会导致内存错误?
- 删除指针后内存泄漏
- 提升进程间共享内存删除、权限和输出文件
- 升级分解共享内存删除对象而无需销毁
- C++内存:删除未使用的布尔数组可以将结果从正确更改为错误
- 函数内的动态内存删除
- 内存删除的运行时检测