我注意到在多个问题中,C++专家询问是否应该使用'new'关键字创建std :: string / std :: map /等(对于C++新手来说,如果不是很明显)。
所以,如果我理解正确,这将不会在堆上创建它,而是在栈上创建它。这意味着在函数超出范围时,对象将消失,但我相信这不是情况,我的理解是错误的。
这是因为底层模板在堆上实例化它并使用auto_ptr进行管理,以免造成内存泄漏吗?这是否适用于所有stl类?
另外,一个跟进问题是,创建插入地图中的对象的方法应该是什么?它们应该在堆上分配(如果它们在函数范围之外有价值)吗?
编辑:
我确实理解堆和栈之间的区别以及使用每个原因(我可能没有表达清楚)。
我之所以问这个问题是因为它似乎不自然,只是在堆栈上实例化一个我想保留的对象。但是,我想这只是语法的样子。
这意味着,当我写下以下内容时,我感觉自己正在使用栈:
所以,如果我理解正确,这将不会在堆上创建它,而是在栈上创建它。这意味着在函数超出范围时,对象将消失,但我相信这不是情况,我的理解是错误的。
这是因为底层模板在堆上实例化它并使用auto_ptr进行管理,以免造成内存泄漏吗?这是否适用于所有stl类?
另外,一个跟进问题是,创建插入地图中的对象的方法应该是什么?它们应该在堆上分配(如果它们在函数范围之外有价值)吗?
编辑:
我确实理解堆和栈之间的区别以及使用每个原因(我可能没有表达清楚)。
我之所以问这个问题是因为它似乎不自然,只是在堆栈上实例化一个我想保留的对象。但是,我想这只是语法的样子。
这意味着,当我写下以下内容时,我感觉自己正在使用栈:
std::map<int,int> mymap;
替代,
std::map<int,int> *mymap = new std::map<int,int>;
我也在思考这对内存的影响。由于现在内存是由该实现本身进行清理,这是否类似于Java中的垃圾回收?在使用STL对象时是否存在隐含的性能影响?
auto_ptr
方面想表达什么。我怀疑任何实现都不会在任何容器的实现中使用它。在栈上创建对象的好处是,你不必管理它的内存,因为当对象超出作用域时,它就会被释放。这也更加安全,可以避免异常。 - chrisnew
。这不仅适用于字符串或映射等特定类型,而是一个普遍规则。 - Patashunew
来初始化某些内容,但在处理中途,有什么东西抛出异常导致程序控制永远无法到达宝贵的delete
语句,后者本应正确地释放内存。这就是你的内存泄漏 :)使用智能指针就不必担心这个问题了。 - Nobilis