为了避免错误,有必要擦除堆栈吗?

时间:2011-02-01 08:52:35

标签: c++

清理int或char(不是指针)需要做什么?

使用后是否有必要清理此类数据?

示例ex:

      // MAX = 100 ;
      class Simple {
              int a[ MAX ] ;
              public :
                  ~Simple ( ) ;
                  ... // some declaration to fill, initialize ...
      };

清理堆栈上的数据是否必要,例如示例中的数组a[ MAX ]

5 个答案:

答案 0 :(得分:2)

您只需要清理使用新的或新的[](或类似函数,如malloc)分配的内容。 在函数返回时自动销毁在堆栈上分配的对象(这意味着在每个类上调用析构函数)

答案 1 :(得分:2)

您不必覆盖 intchar数组,除非您真的关心其中的数据存储可以某种方式用于从您的密码获取敏感数据程序

有关何时需要的详细信息,请参阅thisthis个问题。您可能不需要担心这一点。

但不要将覆盖内存与分配内存混淆。如果您使用new分配class Simple的实例,请确保在某个时刻使用delete取消分配实例,否则会导致内存泄漏。

答案 2 :(得分:0)

自动变量(示例中为a)在包含的代码块结束后到期。如果这就是你的意思

void foo()
{
     int x;
     char z;
     int * y = new int(5);
     ...
     return;
}
x结束后

zfoo()不再存在。 但是y点仍然存在,除非你delete y,否则会发生内存泄漏

答案 3 :(得分:0)

int或char数据不需要特别清理。编译器安排将局部变量放在临时堆栈上,其中内存保留供其使用,而声明它们的函数或块在范围内,之后它们的值保留在那里并且可能被以后使用的内存覆盖。堆上的int和char数据 - 来自newmalloc - 可以使用deletefree取消分配,但旧内容再次留在内存中,直到更进一步newmalloc重复使用该内存。整个程序运行时都存在静态变量。当程序终止时,内存被释放到操作系统,并且可以在允许另一个程序读取之前将其清除回某个可预测的状态 - 原因是为了安全:它阻止来自关闭的应用程序的任何数据对另一个应用程序可见和/或用户。

在你的代码中,析构函数不需要对类的int数组进行任何操作。

答案 4 :(得分:0)

正如其他人所指出的那样,通常只有newmalloc分配的内容才需要明确清理(发布)。

我只想添加一个小细节:如果你的a[]数组应该包含代表资源句柄的整数(例如旧格式的Windows GDI句柄),那么你不要在其他地方发布,你的应用程序将行为不端并最终崩溃。