当在堆栈中推送现有指针时,是否会创建其副本
When a already existing pointer is pushed in a stack, does its copy gets created?
void deleteAllNodes ()
{
stack <parentBranch *> mystack;
// `trunk` is the existing head node
mystack.push (trunk);
cout << mystack.top ()->content;
}
在这种情况下,主干的"副本"被推入堆栈?那么,这是否意味着内存中同时存在两个中继?
不。 trunk
指向对象,但不是对象本身。 就像汽车旁边写着"汽车-->"的标志。 当你把trunk
推到mystack
上时,你不会得到另一辆车。 你只是得到另一个指向同一辆车的标志。
如果你把车开走,那就有祸了(即 delete trunk;
(。 然后你会有一大堆指向汽车的标志,但是当有人走过来并试图上那辆车时,他们会在他们的后方倒地。 所有指向汽车的迹象都是骗子。
指针的副本被推送,但不是它指向的对象的副本。
不,只有一个trunk
,只有两个指向它的指针。
这就是标准库容器不拥有解除分配指针成员内存的所有权,因为它们无法确定谁实际拥有所指向的对象、驻留在容器内的指针还是用于推送操作的指针。
如果使用指针作为容器元素,则强制执行手动内存管理,由用户来确保指向的对象保持有效。
这就是为什么应该使用智能指针而不是标准库容器的原始指针的原因,它可以节省您的手动内存管理。
如果被推入的元素不是指针而是对象,那么该对象将有两个单独的副本,一个存储在容器中,另一个用于推送到容器。
相关文章:
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否删除在对象构造过程中创建的对象
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 是否创建具有不同返回类型的lambda
- 智能指针:是否创建了对象的'base'部分?
- 打开文件,如果不存在,则创建,确定是否创建
- 这是检查 const 函数(如果是否创建某些内容)的更好方法
- 在编译时验证对象是否创建为shared_ptr
- "scoping into"类的头文件是否C++创建它的实例?
- 此分配是否创建副本
- malloc是否创建该类的新实例
- IOCP是否创建自己的线程
- 用于C++对象持久性的ORM ODB是否创建/重新创建DB
- SDL2 - 检查是否创建了 OpenGL 上下文
- 构造函数是否创建类的对象
- C++ 在声明静态成员时是否创建实例
- 继承链是否创建构造函数调用链?
- std::make_shared(new Foo())是否创建单例?
- 编译多源程序文件时,MinGW是否创建目标文件?
- 顺序'new'运算符是否创建连续分配的内存?