在堆栈对象上持有指针

时间:2015-05-29 08:58:57

标签: c++ pointers smart-pointers

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

的主题

就我而言,我有一个抽象类A和实现A的具体类:C

C c1;
C c2;
C c3;

我想将这些对象放在像地图一样的容器中

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来保存堆栈对象的地址,还是应该使用原始指针?

由于

1 个答案:

答案 0 :(得分:1)

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

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

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