首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中,Object Mat(Args)和Object *Mat = new Mat(Args)之间的内存分配明智的区别是什么?

在C++中,Object Mat(Args)和Object *Mat = new Mat(Args)之间的内存分配明智的区别是什么?
EN

Stack Overflow用户
提问于 2012-09-23 07:19:20
回答 3查看 214关注 0票数 0

可能重复: 在C++中正确使用堆栈和堆吗? 堆与堆栈分配

我试图理解为什么我从Java移植到C++的库(在使用转换器之后的漫长而艰巨的编辑工作)不会释放内存,只会在崩溃前爆炸虚拟内存。显然,这与Java的GC和C++无关有关--而且算法已经非常直接地转换为C++。

这是我的问题。我在哪里和如何删除分配的内存(释放它)?当我有:

代码语言:javascript
运行
复制
Matrix *mat = new Matrix(args);

显然,我需要用一个delete mat;来结束作用域。我能避免这样吗?使用Matrix mat(args);会更好吗?在内存分配和释放方面?或者使用Matrix mat = Matrix(args)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-23 07:21:43

在哪里以及如何删除分配的内存?(免费)

在大多数情况下,如果正确编码,就不必显式释放或取消分配任何内存。要么使用自动分配,要么使用智能指针。否则,哪里的答案是相当令人不满意的:无论您需要什么,取决于您的程序。答案是如何更简单:使用delete (或用于动态分配数组的delete[] )。

..。显然,我需要用删除垫来结束范围;我能避免这种情况吗?

是的,如果您使用自动分配:

代码语言:javascript
运行
复制
Matrix mat(args);

通常情况下,只有在真正需要时才应该使用动态分配的对象。如果你不知道你是否真的需要,那你很可能不需要。

..。或使用矩阵mat =矩阵(Args);

这将执行副本初始化,并且在此上下文中不提供比Matrix mat(args);更多的优势。表达式的RHS是一个临时Matrix对象,用于复制构造LHS mat

这是最近的一个相关员额

票数 2
EN

Stack Overflow用户

发布于 2012-09-23 07:21:01

第二个选项是,如果不希望对象存在于创建对象的范围之外,则更好。

当作用域结束时,它会自动释放对象,这与动态内存选项不同,在动态内存选项中,必须显式地记住delete对象。

好读:

为什么C++程序员应该尽量减少“新”的使用?

票数 1
EN

Stack Overflow用户

发布于 2012-09-23 07:32:55

您确实需要了解C/C++中内存分配是如何工作的。

我建议你从一本关于它的书开始,因为这个问题意味着你对C++没有太多的经验。

对眼前的事情:

Matrix *mat = new Matrix(args);在堆上创建一个Matrix对象,这意味着它不绑定到作用域(当然,指针仍然绑定),使用delete释放它是您的责任。

Matrix mat(args); --在这里,您在堆栈上创建一个对象,当它的作用域结束时,它将被销毁,这在Java中是不可用的,只有基本类型除外。

至于性能--在堆栈上创建对象不仅更安全(自动销毁),而且速度更快--您的堆栈内存是预先分配的,而且不需要搜索空闲块。

当从堆中创建内存时--您的过程最终会向虚拟内存管理器请求内存,从而造成巨大的性能损失。

话虽如此--任何类型的分配都有时间和地点--而且您应该使用对自己代码更好的任何东西--没有“正确的方法”这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12550482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档