返回引用后从内存中删除

时间:2013-04-08 22:41:03

标签: c++

我有一个关于在C ++中从内存中删除内容的问题,以及将要存在和不存在的内容。如果我在C ++(标准库)中创建一个队列,则向其中添加两个元素,然后调用front(),将其存储在常规变量(无指针)中。然后我在队列上调用pop()。我存储的变量仍然存在吗?如果某些内容编辑了队列中指针所在的内存地址,会发生什么?这是否意味着我之前存储的局部变量不再有效,因为它是从引用创建的?

感谢您的任何澄清。

3 个答案:

答案 0 :(得分:3)

假设您不是在队列中存储指针,而是将实际值或对象存储在指针中,那么当您将front()存储到常规变量时,您实际所做的就是复制(如果它是&#39 ; s是一个对象,将调用实际的复制构造函数)。当pop()队列的元素时,副本不会受影响。

答案 1 :(得分:2)

我会尝试用代码回答:

#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()的返回值引用的对象分配的,我们也对该对象进行了复制

答案 2 :(得分:-2)

如果你用front()存储它,然后你弹出它你的对象不再存在(假设你正在使用STL队列)

这是因为front()通过引用返回包含的对象而不是复制。