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++ 中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章