当在堆栈中推送现有指针时,是否会创建其副本

When a already existing pointer is pushed in a stack, does its copy gets created?

本文关键字:是否 创建 副本 指针 堆栈      更新时间:2023-10-16
void deleteAllNodes ()
{
    stack <parentBranch *> mystack;
    // `trunk` is the existing head node
    mystack.push (trunk);
    cout << mystack.top ()->content;
}

在这种情况下,主干的"副本"被推入堆栈?那么,这是否意味着内存中同时存在两个中继?

不。 trunk指向对象,但不是对象本身。 就像汽车旁边写着"汽车-->"的标志。 当你把trunk推到mystack上时,你不会得到另一辆车。 你只是得到另一个指向同一辆车的标志。

如果你把车开走,那就有祸了(即 delete trunk; (。 然后你会有一大堆指向汽车的标志,但是当有人走过来并试图上那辆车时,他们会在他们的后方倒地。 所有指向汽车的迹象都是骗子。

指针的副本被推送,但不是它指向的对象的副本。

不,只有一个trunk,只有两个指向它的指针。

这就是标准库容器不拥有解除分配指针成员内存的所有权,因为它们无法确定谁实际拥有所指向的对象、驻留在容器内的指针还是用于推送操作的指针。

如果使用指针作为容器元素,则强制执行手动内存管理,由用户来确保指向的对象保持有效。
这就是为什么应该使用智能指针而不是标准库容器的原始指针的原因,它可以节省您的手动内存管理。

如果被推入的元素不是指针而是对象,那么该对象将有两个单独的副本,一个存储在容器中,另一个用于推送到容器。