Object Mat(args); 之间有啥区别 - 明智的内存分配和对象 *Mat = new Mat(args);在 C++ 中? [复制]

Posted

技术标签:

【中文标题】Object Mat(args); 之间有啥区别 - 明智的内存分配和对象 *Mat = new Mat(args);在 C++ 中? [复制]【英文标题】:What is the Difference - Memory Allocation Wise - between Object Mat(args); and Object *Mat = new Mat(args); in C++? [duplicate]Object Mat(args); 之间有什么区别 - 明智的内存分配和对象 *Mat = new Mat(args);在 C++ 中? [复制] 【发布时间】:2012-09-15 01:17:46 【问题描述】:

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

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

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

Matrix *mat = new Matrix(args);

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

【问题讨论】:

也许使用smart pointer? ***.com/questions/106508/… 请问你用的是什么“转换器”?恕我直言,没有办法可靠地做到这一点。最后,你是一个重新实现一切的人。 【参考方案1】:

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

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

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

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

Matrix mat(args);

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

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

这会执行复制初始化,在这种情况下,与Matrix mat(args); 相比没有任何优势。表达式的右轴是一个临时的Matrix 对象,用于复制构造左轴mat

这是最近的related post。

【讨论】:

【参考方案2】:

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

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

好读:

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

【讨论】:

优秀的答案。简洁的。谢谢。【参考方案3】:

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

【讨论】:

以上是关于Object Mat(args); 之间有啥区别 - 明智的内存分配和对象 *Mat = new Mat(args);在 C++ 中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

图像的opencv中以下两行之间有啥区别

“mat-form-field”和“mat-input-container”有啥区别

Android:浅堆和保留堆有啥区别

以下 3 个 opencv Mat 实例有啥区别?

Object C和C++有啥区别

交互式计算机图形学中的 glu 函数和 mat.h 函数有啥区别?