有什么区别 - 内存分配明智 - 对象垫之间(args);和对象* Mat = new Mat(args);在C ++中?

时间:2012-09-23 07:19:20

标签: c++ pointers memory-management stack heap

  

可能重复:
  Proper stack and heap usage in C++?
  Heap vs Stack allocation

我试图理解为什么我从Java移植到C ++的库(使用转换器后长时间和艰苦的编辑工作)不释放内存,只是爆炸虚拟内存直到崩溃。 显然这与没有GC和C ++的Java有关 - 并且算法非常简单地转换为C ++。

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

Matrix *mat = new Matrix(args);

我显然需要用delete mat;结束范围。我可以避免这个吗? 使用Matrix mat(args);会更好吗?在内存分配和释放方面? 或者使用Matrix mat = Matrix(args)

3 个答案:

答案 0 :(得分:2)

  

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

在大多数情况下,如果您正确编码了事物,则不必显式释放或取消分配任何内存。使用自动分配或smart pointers。否则, 的答案相当不满意:根据您的计划,您需要的地方。 如何更简单:使用delete(或动态分配的数组为delete[])。

  

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

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

Matrix mat(args);

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

  

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

这会执行复制初始化,并且在此上下文中没有优于Matrix mat(args);的优势。表达式的RHS是一个临时Matrix对象,用于复制构造LHS mat

这是最近的related post

答案 1 :(得分:1)

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

一旦范围结束,它会自动释放您的对象,这与动态内存选项不同,您必须明确记住delete对象。

好读:

Why should C++ programmers minimize use of 'new'?

答案 2 :(得分:0)

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