我注意到了多个问题,C++专家询问了std::string/std::map/etc。不应使用'new'关键字创建(对于C++,不是新手,如果不是显而易见的话)。
因此,如果我的理解是正确的,那将不会在堆上而是在堆栈上创建它。这意味着一旦函数超出范围,对象就会消失,但我认为并非如此,我的理解是错误的。
这是因为基础模板在堆上实例化了它并使用auto_ptr对其进行了管理,从而不会引起内存泄漏吗?这是否适用于所有STL类?
另外,一个后续问题是创建插入 map 的对象的方法应该是什么?是否应该在堆上分配它们(如果它们在函数范围之外很有值(value))?
编辑:
我确实了解堆和堆栈之间的区别以及使用它们的原因(对此我可能不太清楚)。
我要求这样做的原因似乎是不自然的,只是为要保留的对象实例化堆栈上的对象。但是,我想这就是语法的样子。
这意味着,我在写作时感觉就像在堆东西,
std::map<int,int> mymap;
代替,
std::map<int,int> *mymap = new std::map<int,int>;
我也想知道这对内存的影响。由于现在内存是由此实现本身清理的,它类似于Java中的垃圾回收吗?使用STL对象时是否会对性能产生隐含影响?
最佳答案
将某些内容放到堆上的常见原因之一是在编译时不知道大小,并且您需要灵活地分配一些未知数量的对象。 string
和map
的内部实现以及其他容器将根据需要从堆中自动分配,从而减轻了您的负担。将对象本身放在堆上变得多余。
将容器放到堆上的唯一原因是当您需要使容器的生命周期比创建容器的块更长的时间时。
关于c++ - 为什么不鼓励在堆上创建std::string/std::map?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16806165/