0

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

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

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

Matrix *mat = new Matrix(args);

我显然需要以delete mat;. 我可以避免这种情况吗?使用Matrix mat(args);会更好吗?在内存分配和释放方面?还是使用Matrix mat = Matrix(args)

4

3 回答 3

2

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

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

...我显然需要用删除垫结束范围;我可以避免这种情况吗?

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

Matrix mat(args);

作为一般规则,您应该只在确实需要时才使用动态分配的对象。如果你不知道你是否真的需要,那么你可能不需要。

...或使用矩阵 mat = Matrix(args);

这将执行复制初始化,在这种情况下,与Matrix mat(args);. 表达式的 RHS 是一个临时Matrix对象,用于复制构造 LHS mat

这是最近的相关帖子

于 2012-09-23T07:21:43.967 回答
1

如果您不希望对象超出创建它的范围,则第二种选择会更好。

一旦作用域结束,它会自动释放您的对象,这与您必须显式记住delete对象的动态内存选项不同。

好读:

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

于 2012-09-23T07:21:01.480 回答
0

您确实需要了解 C/C++ 中的内存分配是如何工作的。
我建议你从一本关于它的书开始,因为这个问题意味着你没有很多 C++ 经验。
对于手头的问题:
Matrix *mat = new Matrix(args); 在这里,您在堆上创建了一个Matrix对象,这意味着它没有绑定到范围(当然,指针仍然如此)并且您有责任使用delete.
Matrix mat(args);- 这里你在栈上创建了一个对象,当它的作用域结束时它会被破坏,这在Java中是不可用的,除了原始类型。
至于性能 - 在堆栈上创建对象不仅更安全(自动销毁)而且速度更快 - 除了不需要搜索空闲块之外,您的堆栈内存是预先分配的。
从堆中创建内存时 - 您的进程最终会向虚拟内存管理器请求内存,从而导致巨大的性能损失。
话虽如此 - 任何类型的分配都有时间和地点 - 你应该使用对你自己的代码更好的东西 - 没有“正确的方法”这样做。

于 2012-09-23T07:32:55.330 回答