1

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

感谢您的任何澄清。

4

3 回答 3

3

假设您不在队列中存储指针,而是在实际值或对象中存储,那么当您将 front() 存储到常规变量时,您真正要做的是一个副本(如果它是一个对象,则实际的复制构造函数将是称为)。当您 pop() 队列的元素时,副本不会受到影响。

于 2013-04-08T22:44:01.307 回答
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(),我们也复制了该对象!

于 2013-04-08T22:52:44.700 回答
-2

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

发生这种情况是因为 front() 通过引用而不是副本返回包含的对象。

于 2013-04-08T22:44:43.790 回答