堆栈对象上的保存指针

holding pointer on stack object

本文关键字:保存 指针 对象 堆栈      更新时间:2023-10-16

我读了关于smart_ptr的主题什么是智能指针,什么时候我应该使用一个?

在我的例子中,我有一个抽象类A和实现A的具体类:C

C c1;
C c2;
C c3;

我想把这些对象放到一个容器里,比如map

std::map<std::string, A&> mymap;
mymap["foo"] = c1;

所以不能初始化抽象类。我找到的解决方案是使用ptr,如

std::map<std::string, A*> mymap;
mymap["foo"] = &c1;

我想知道是否有任何类型的smart_pointer可以取代原始指针A*。在主题中显示的示例中,只有动态分配,如:

std::map<std::string, uniq_ptr<A>> mymap;
mymap["foo"] = new C();

那么,是否有一个智能ptr来保存堆栈对象的地址,或者我应该使用原始指针?

谢谢

应该使用原始指针来表示堆栈上的对象。

智能指针本质上是在其析构函数中调用delete,只有在通过new创建对象时才需要delete。

堆栈上对象不需要/允许调用delete,当它们超出作用域时,它们的析构函数将被自动调用,并且它们的内存将作为将堆栈指针移动到堆栈开头的一部分被回收(这总是在每次函数返回时发生)。