我有一个关于在 C++ 中从内存中删除内容的问题,以及将不再存在和不再存在的问题。如果我在 C++(标准库)中创建一个队列,向其中添加两个元素,然后调用 front(),将其存储在常规变量中(无指针)。然后我在队列中调用 pop()。我存储的变量仍然存在吗?如果某些东西编辑了队列中的指针曾经存在的内存地址,会发生什么?这是否意味着我之前存储的局部变量不再有效,因为它是从引用创建的?
感谢您的任何澄清。
我有一个关于在 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() 通过引用而不是副本返回包含的对象。