我有点陷入内存管理的概念(我以前所有的编程语言都不需要我管理内存)。如果我以后不销毁它,我不确定创建变量是否会消耗内存。
#include <math.h>
#include <iostream>
using namespace std;
double sumInfiniteSeries(double u1, double r){
return u1 / (1 - r);
}
double sumInfiniteSeries(double u1, double r, bool printSteps){
if (printSteps){
double lastTotal;
double total = 0.0;
double sn = u1;
for (int n=1;n<=1000;n++){
lastTotal = total;
total += sn;
sn *= r;
cout << "n = " << n << ": " << total << endl;
if (fabs(lastTotal - total) < 0.000000000000001) return total;
}
return total;
} else {
return sumInfiniteSeries(u1, r);
}
}
我是否需要“销毁”这两个函数中的任何变量?
编辑:那么当我创建自己的类及其实例时,我需要启动内存管理吗?
答案 0 :(得分:15)
什么内存管理?你只是在这里使用堆栈,不需要内存管理。
当您使用new
和delete
时,手动内存管理会发挥作用。
答案 1 :(得分:3)
只要你远离new
,尤其是delete
,就没有什么可担心的了w.r.t. C ++中的内存管理。
如果您确实遇到需要使用new
手动分配内存的情况,那么您可以做的最好的事情是立即将该内存的责任交给智能指针类,如{{1 }},auto_ptr<T>
,unique_ptr<T>
等。假设您使用具有正确语义的那个,它们将确保在恰当的时间释放内存。
答案 2 :(得分:2)
阅读Scott Meyers Effective C++以避免数周的痛苦。这是你作为C ++程序员开始所花费的最好的$$。特别是,了解RAII是什么。
答案 3 :(得分:1)
当您声明一个没有分配限定符的变量时,编译器假设您的意思是auto
。自动变量存在于定义它的作用域的生命周期中,然后消失。这通常发生在(虽然不是通过语言本身的命令)将这些变量的存储位置放在调用堆栈上。当函数完成时,当调用将函数的堆栈帧弹出调用堆栈时,将自动回收这些变量使用的内存。
答案 4 :(得分:0)
您只需要销毁堆中分配的变量(即通过new
或malloc
调用)。
在您的示例中,您只有自动变量,因此无法手动销毁它们。
答案 5 :(得分:0)
其他答案是正确的,因为您不会因此代码导致任何内存泄漏。 但为了完整起见,还有其他方法可以浪费内存。 就像通过值而不是通过引用传递对象一样。
在你的情况下,这不是问题。你传递的是双打和布尔。 在典型的机器上,双精度数是8个字节,而不是通过引用传递所需的4字节指针。除非你认为这将是一个非常繁忙和并发的功能,否则不会有太大的交易。
但是如果你使用更大的对象(结构,类等),你最好传递const引用,而不是让系统创建一个新结构并调用复制构造函数来填充它。
答案 6 :(得分:0)
你的代码很好。 C ++内存管理的基本规则是返回你得到的:)。如果您使用new获得了一些内存,请使用delete将其返回给系统。
我知道你来自哪里。这是我在C ++中掌握内存管理的建议列表:
还要记住,对于每一个新的必须有相应的删除。否则这是内存“泄漏”的情况。在调用new / delete时谨慎使用 - 这些调用过多会使你的程序变慢。
最后,自动管理的编程语言(包括那些具有垃圾收集相关API的编程语言)可能并不总是解决问题域的最佳解决方案。如果正确完成,精细内存管理确实有助于性能优化。
答案 7 :(得分:0)