我注意到多个问题,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对象时是否存在隐含的性能影响?
答案 0 :(得分:14)
这不是std::string
或std::map
特有的。它只是C ++中几乎所有对象的一般规则。
要自动执行资源管理,您通常希望将每个资源绑定到一个范围,该范围包含所需资源的时间。假设您一致地执行此操作,当执行离开定义范围时,每个资源都会自动清理。
这通常被称为“RAII”(资源获取是初始化),但有些使用更具描述性的术语SBRM(范围限制资源管理)。无论您使用哪种术语,只要使用适当(且一致),它都可以很好地工作。
“RAII”术语的原因是这意味着大多数资源是在对象构建期间获取的,并在对象销毁期间释放。这往往会导致相当特定的编码风格,其中(除其他外)对象非常精细,因为每个对象都管理一个特定资源的生命周期。
答案 1 :(得分:5)
在堆上放置一些东西的一个常见原因是在编译时不知道大小,并且您需要灵活地分配一些未知数量的对象。 string
和map
的内部实现以及其他容器将根据需要自动从堆中分配,从而减轻您的负担。将对象本身放在堆上变得多余。
将容器放在堆上的唯一原因是当您需要其生命周期长于创建它的块时。