删除指针和重新分配在c+中给出相同的结果+;? 我对C++指针删除和重新分配有问题。请给我介绍一下这两种方法。我没有机会使用智能指针。(这不是实际的代码-我应该用int替换引用类型) #包括 #包括 使用名称空间std; int main(){ queueq; int*a=新的int(5); q、 推(a); /*1.方法*/ 而(!q.empty()){ int*x=q.pop(); ……做点什么。。。 delete x;/*此处是否删除第一个创建的int a对象*/ /*还是只删除新创建的*x分配*/ } /*2.方法*/ int*x=q.pop(); 而(!q.empty()){ ……做点什么。。。 *x=q.pop(); } /*这里我重新分配了x的值。这里是不是删除了一个对象中创建的第一个int*/ /*2方法=1方法吗*/ 返回0; }

删除指针和重新分配在c+中给出相同的结果+;? 我对C++指针删除和重新分配有问题。请给我介绍一下这两种方法。我没有机会使用智能指针。(这不是实际的代码-我应该用int替换引用类型) #包括 #包括 使用名称空间std; int main(){ queueq; int*a=新的int(5); q、 推(a); /*1.方法*/ 而(!q.empty()){ int*x=q.pop(); ……做点什么。。。 delete x;/*此处是否删除第一个创建的int a对象*/ /*还是只删除新创建的*x分配*/ } /*2.方法*/ int*x=q.pop(); 而(!q.empty()){ ……做点什么。。。 *x=q.pop(); } /*这里我重新分配了x的值。这里是不是删除了一个对象中创建的第一个int*/ /*2方法=1方法吗*/ 返回0; },c++,C++,删除x;/*这里是否删除第一个创建的int对象*/ 对。new调用分配了内存并返回了一个指针,您将其推送到队列中。然后(尝试)将值弹出到x。您可以随意复制指针,但它们只被分配和删除一次 /*还是仅删除新创建的*x分配*/ 什么?不。不管你想问什么,答案都是否定的。这个问题很麻烦 /*我在这里重新分配x的值。这里是一个对象吗*/ 不,您不是在“重新分配x的值”。假设这段代码可以编译(它没有编译),但假设它做了您认为它应该做的事情,那么答案是否定的。您也不会删除“First created int

删除x;/*这里是否删除第一个创建的int对象*/

对。
new
调用分配了内存并返回了一个指针,您将其推送到队列中。然后(尝试)将值弹出到
x
。您可以随意复制指针,但它们只被分配和删除一次

/*还是仅删除新创建的*x分配*/

什么?不。不管你想问什么,答案都是否定的。这个问题很麻烦

/*我在这里重新分配x的值。这里是一个对象吗*/

不,您不是在“重新分配x的值”。假设这段代码可以编译(它没有编译),但假设它做了您认为它应该做的事情,那么答案是否定的。您也不会删除“First created int a object”

发生的情况是,您泄漏了存储在
a
中的原始值的内存(并随后推送到您的队列),因为您从未删除它。此外,队列在第一次弹出后是空的,您永远不会进入循环

但是,如果您确实进入了循环,则会出现类型冲突,此时您正在存储刚弹出到整数大小的内存位置的指针,该内存位置最初在
a
中分配,然后弹出到
x
。编译器应该警告您这一点

现在,让我们假设您说(这里我还向您展示了从
std::queue
访问和弹出的正确方法):

现在您仍然泄漏了
x
的旧值,因为您没有将其存储在任何其他地方,也没有删除它。您已将其替换为队列中的下一个值,您也不会删除该值,因此您可能也会泄漏

/*是2方法=1方法吗*/

不,方法1是最正确的,但你还是错了。你的意思是:

while( !q.empty() )
{
    int *x = q.front();
    q.pop();

    // do something...

    delete x;
}

std::queue::pop()
不返回任何内容。这甚至可以编译吗?你需要指针吗<代码>队列
应该足够了。请问一个实际的问题。问题不在于我们能否回答,而在于我们能否回答得比无数已经详细解释了指针和分配工作原理的参考文献更好。该程序中只有一个分配-
新int(5)
。不要混淆物体的位置和物体本身。
x = q.front();
q.pop();
while( !q.empty() )
{
    int *x = q.front();
    q.pop();

    // do something...

    delete x;
}