可能重复: 在C++中正确使用堆栈和堆吗? 堆与堆栈分配
我试图理解为什么我从Java移植到C++的库(在使用转换器之后的漫长而艰巨的编辑工作)不会释放内存,只会在崩溃前爆炸虚拟内存。显然,这与Java的GC和C++无关有关--而且算法已经非常直接地转换为C++。
这是我的问题。我在哪里和如何删除分配的内存(释放它)?当我有:
Matrix *mat = new Matrix(args);显然,我需要用一个delete mat;来结束作用域。我能避免这样吗?使用Matrix mat(args);会更好吗?在内存分配和释放方面?或者使用Matrix mat = Matrix(args)
发布于 2012-09-23 07:21:43
在哪里以及如何删除分配的内存?(免费)
在大多数情况下,如果正确编码,就不必显式释放或取消分配任何内存。要么使用自动分配,要么使用智能指针。否则,哪里的答案是相当令人不满意的:无论您需要什么,取决于您的程序。答案是如何更简单:使用delete (或用于动态分配数组的delete[] )。
..。显然,我需要用删除垫来结束范围;我能避免这种情况吗?
是的,如果您使用自动分配:
Matrix mat(args);通常情况下,只有在真正需要时才应该使用动态分配的对象。如果你不知道你是否真的需要,那你很可能不需要。
..。或使用矩阵mat =矩阵(Args);
这将执行副本初始化,并且在此上下文中不提供比Matrix mat(args);更多的优势。表达式的RHS是一个临时Matrix对象,用于复制构造LHS mat。
这是最近的一个相关员额。
发布于 2012-09-23 07:21:01
第二个选项是,如果不希望对象存在于创建对象的范围之外,则更好。
当作用域结束时,它会自动释放对象,这与动态内存选项不同,在动态内存选项中,必须显式地记住delete对象。
好读:
发布于 2012-09-23 07:32:55
您确实需要了解C/C++中内存分配是如何工作的。
我建议你从一本关于它的书开始,因为这个问题意味着你对C++没有太多的经验。
对眼前的事情:
Matrix *mat = new Matrix(args);在堆上创建一个Matrix对象,这意味着它不绑定到作用域(当然,指针仍然绑定),使用delete释放它是您的责任。
Matrix mat(args); --在这里,您在堆栈上创建一个对象,当它的作用域结束时,它将被销毁,这在Java中是不可用的,只有基本类型除外。
至于性能--在堆栈上创建对象不仅更安全(自动销毁),而且速度更快--您的堆栈内存是预先分配的,而且不需要搜索空闲块。
当从堆中创建内存时--您的过程最终会向虚拟内存管理器请求内存,从而造成巨大的性能损失。
话虽如此--任何类型的分配都有时间和地点--而且您应该使用对自己代码更好的任何东西--没有“正确的方法”这样做。
https://stackoverflow.com/questions/12550482
复制相似问题