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