在引用返回后从内存中删除

Deleteing from memory after reference has returned

本文关键字:内存 删除 引用 返回      更新时间:2023-10-16

我有一个关于在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()通过引用而不是复制返回所包含的对象。