在内存管理方面,这块C ++被认为是否合适?

时间:2010-09-14 14:33:17

标签: c++

我有点陷入内存管理的概念(我以前所有的编程语言都不需要我管理内存)。如果我以后不销毁它,我不确定创建变量是否会消耗内存。

#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);
 }
}

我是否需要“销毁”这两个函数中的任何变量?

编辑:那么当我创建自己的类及其实例时,我需要启动内存管理吗?

8 个答案:

答案 0 :(得分:15)

什么内存管理?你只是在这里使用堆栈,不需要内存管理。

当您使用newdelete时,手动内存管理会发挥作用。

答案 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)

您只需要销毁堆中分配的变量(即通过newmalloc调用)。

在您的示例中,您只有自动变量,因此无法手动销毁它们。

答案 5 :(得分:0)

其他答案是正确的,因为您不会因此代码导致任何内存泄漏。 但为了完整起见,还有其他方法可以浪费内存。 就像通过值而不是通过引用传递对象一样。

在你的情况下,这不是问题。你传递的是双打和布尔。 在典型的机器上,双精度数是8个字节,而不是通过引用传递所需的4字节指针。除非你认为这将是一个非常繁忙和并发的功能,否则不会有太大的交易。

但是如果你使用更大的对象(结构,类等),你最好传递const引用,而不是让系统创建一个新结构并调用复制构造函数来填充它。

答案 6 :(得分:0)

你的代码很好。 C ++内存管理的基本规则是返回你得到的:)。如果您使用new获得了一些内存,请使用delete将其返回给系统。

我知道你来自哪里。这是我在C ++中掌握内存管理的建议列表:

  1. 学习将malloc / calloc / alloca / free与new / delete / new [] / delete []进行比较和对比。
  2. 对运营商新/运营商删除使用情况充满信心
  3. 了解新的位置 - 这与2结合形成了用户定义的内存管理的关键。
  4. 谷歌的RAII一词,了解auto_ptr和scoped_ptr
  5. 学会优雅地处理错误情况。对于例如当new失败时,它应该抛出std :: bad_alloc类型的异常。
  6. 了解Dougleas Lea的dlmalloc实施(google it)
  7. 还要记住,对于每一个新的必须有相应的删除。否则这是内存“泄漏”的情况。在调用new / delete时谨慎使用 - 这些调用过多会使你的程序变慢。

    最后,自动管理的编程语言(包括那些具有垃圾收集相关API的编程语言)可能并不总是解决问题域的最佳解决方案。如果正确完成,精细内存管理确实有助于性能优化。

答案 7 :(得分:0)