5

我注意到多个问题,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 对象时是否存在隐含的性能影响?

4

2 回答 2

15

这不是std::stringor所特有的std::map。这只是关于 C++ 中几乎所有对象的一般规则。

为了自动化资源管理,您通常希望将每个资源绑定到某个范围,该范围包含需要该资源的时间。假设您始终如一地这样做,当执行离开定义它的范围时,每个资源都会自动清理。

这通常被称为“RAII”(资源获取即初始化),尽管有些人使用更具描述性的术语 SBRM(范围绑定资源管理)。无论您使用什么术语,只要使用得当(且一致),它都能很好地工作。

“RAII”一词的原因是,这意味着大多数资源是在对象构建期间获取的,并在对象销毁期间释放。这往往会导致一种相当特定的编码风格,其中(除其他外)对象非常精细,因为每个对象都管理一个特定资源的生命周期。

于 2013-05-29T05:41:13.330 回答
8

将某些东西放在堆上的常见原因之一是在编译时不知道大小,并且您需要分配一些未知数量的对象的灵活性。string和其他容器的内部实现map将根据需要自动从堆中分配,从而减轻您的负担。将对象本身放在堆上变得多余。

将容器放在堆上的唯一原因是当您需要它的生命周期比创建它的块长时。

于 2013-05-29T05:53:17.323 回答