在堆栈对象上保持指针

holding pointer on stack object

我阅读了关于 smart_ptr What is a smart pointer and when should I use one?

的主题

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

C c1;
C c2;
C c3;

我想把这些对象像地图一样放在一个容器里

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

所以我无法初始化抽象class。 我在堆栈溢出上找到的解决方案是使用 ptr like

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

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

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

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

谢谢

您应该为堆栈上的对象使用原始指针。

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

栈上对象不require/allow调用delete,它们的析构函数将在超出范围时自动调用,并且它们的内存将作为将堆栈指针移向开始的一部分回收堆栈(总是发生在每个函数 return)。