我阅读了有关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;
所以我无法初始化一个抽象类。 我在堆栈溢出时发现的解决方案是使用像
这样的ptrstd::map<std::string, A*> mymap;
mymap["foo"] = &c1;
我想知道是否有任何类型的smart_pointer可以替换原始指针A*
。在主题中显示的示例中,只有动态分配,如:
std::map<std::string, uniq_ptr<A>> mymap;
mymap["foo"] = new C();
那么,是否有一个智能ptr来保存堆栈对象的地址,还是应该使用原始指针?
由于
答案 0 :(得分:1)
您应该对堆栈上的对象使用原始指针。
智能指针本质上是在析构函数中调用delete,只有在通过new创建对象时才需要删除。
堆栈上的对象不需要/允许调用delete,当他们的析构函数超出范围时会自动调用它们的内存,并且它们的内存将作为移动堆栈指针的一部分回收到开头堆栈(总是在每个函数返回时发生)。