在堆栈对象上保持指针
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)。
我阅读了关于 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)。