【发布时间】:2023-03-13 05:46:01
【问题描述】:
我注意到多个问题,C++ 专家询问 std::string/std::map/etc。不应使用“new”关键字创建(C++ 新手,如果不明显的话)。
所以,如果我的理解是正确的,这不会在堆上创建它,而是在堆栈上创建。这意味着一旦函数超出范围,对象就会消失,但我认为事实并非如此,我的理解是错误的。
这是因为底层模板在堆上实例化它并使用 auto_ptr 对其进行管理,从而不会导致内存泄漏?这适用于所有 stl 类吗?
另外,一个后续问题是创建插入地图的对象的方法应该是什么?是否应该在堆上分配它们(如果它们在函数范围之外有价值)?
编辑:
我确实了解堆和堆栈之间的区别以及使用它们的原因(我可能不清楚这一点)。
我要求这样做的原因是,仅在堆栈上为我想保留的对象实例化一个对象似乎不自然。但是,我想这就是语法的样子。
这意味着,当我写作时,我觉得我在堆栈上有些东西,
std::map<int,int> mymap;
而不是,
std::map<int,int> *mymap = new std::map<int,int>;
我也想知道这对内存的影响。既然现在这个实现自己清理了内存,是不是类似于Java中的垃圾回收?使用 stl 对象是否会对性能产生隐含影响?
【问题讨论】:
-
您输入的内容被复制了。不过,我不知道您对
auto_ptr有何看法。我怀疑任何实现在任何容器的实现中都使用它。在堆栈上创建东西的好处是您不必管理它的内存,因为当对象超出范围时它会被释放。它也更加安全。 -
“一旦函数超出范围,对象就会消失”当你关心这个问题时,你不应该首先在堆上创建。
-
也许一个带有预期问题或流程的特定代码示例可以帮助我们准确了解我们中的哪一部分可能与不同的条款不同。
-
只有在方法返回后需要对象持久化时才需要使用
new。它不是特定于字符串或映射或任何东西,它是一般规则。 -
如果你有机会,看看 Scott Meyers 的 Effective C++。那里有一章是关于使用智能指针来防止内存泄漏的。它专门讨论了下面一张海报提到的“RAII”成语。一个简单的例子是使用
new来初始化一些东西,在处理它的中途,一些东西引发了一个异常,导致程序控制永远无法到达宝贵的delete语句,该语句将正确地取消分配内存。有你的内存泄漏:) 有了智能指针,就不用担心了。
标签: c++ memory-management stl