为什么内存位置分配了垃圾值?

时间:2015-04-17 16:28:13

标签: c++ memory memory-management

我总是想知道为什么存储空间中存储了垃圾值。为什么内存不能用零填充。有什么特别的原因吗?

例如:

int a ;
cout<<a //garbage value displayed

6 个答案:

答案 0 :(得分:7)

分配零需要时间,并不总是程序员想要做的事情。考虑一下:

int a;
std::cin >> a;

为什么在你要做的第一件事就是在那里存储不同的值时,浪费时间将零加载到内存中?

答案 1 :(得分:1)

现代操作系统会在您的进程首次访问内存之前将内存初始化为0。但是一旦它被使用过,除非有特殊需要,否则通常没有必要再将其归零。 “垃圾值”就是最后写入该内存的内容。

答案 2 :(得分:1)

因为清除内存(或肯定是)很昂贵,并且在大量常见情况下不需要它。

在示例中,您将显示其堆栈内存。每次将其归零(基本上每个函数调用都必须清除一块内存)会非常昂贵。

答案 3 :(得分:1)

(主要是历史性的)表现原因。将以后分配了适当值的内存位置清零是不必要的工作,其中一个c / c ++口号是&#34;你不会为你不需要的东西买单&#34;。

通常你总是应该在声明它时正确地初始化变量,但是特别是在c中,你有时候还不知道变量的初始值应该是什么。

编辑:如果你的问题是关于垃圾数据的来源:它只是先前存储在同一物理地址的数据。可以说,您正在紧接着调用以下两个函数:

void foo(){
    int a=5;
}
void foo2() {
    int b;
    std::cout << b << std::endl;
}

int main() {
    foo1();
    foo2();
}

很可能,(在调试模式下)程序的输出将是5(我相信,这实际上是UB,所以 - 考虑到编译器优化 - 当然可能发生任何事情)

答案 4 :(得分:0)

您获得的垃圾值是先前存储在该地址中的值。但是在C ++(以及许多其他语言)中,将它们全部初始化为零是一项非常昂贵的任务,编译器不会这样做。这会浪费很多时间,编译器可能会将其用于其他目的。因此,编译器不会分配新值。

但是还有其他编译器将它们初始化为0,但C ++不是其中之一。

通常,编译器会期望您为新变量赋予新值。像

int a = 0;  // this is not so hard to do

int a;
std::cin >> a ;

因此,我们分配一个值比编译器初始化然后覆盖它更有效。

如果您在访问它们之前没有为它们分配值,编译器会向您发出有关未初始化变量的警告。 (如果您打开了编译器警告)。

答案 5 :(得分:0)

垃圾值来自内存空间中的内容。在您的情况下,您只声明了变量而没有初始化它。声明变量并且未初始化变量时,将为该变量分配内存但不清除,主要是出于性能原因。因此,它可能包含您不希望它包含的初始值,这可能由于多种原因而发生。根据{{​​3}}第10章,有几个原因包括:

  • 从未为变量赋值。它的值是程序启动时在其内存区域中发生的任何位。
  • 变量中的值已过时。变量在某个时刻被赋值,但该值不再有效。
  • 部分变量已分配值而部分未分配(具体涉及可能包含多个数据成员的对象)。

一个好的做法是尽可能地将变量声明并初始化到他们首次使用的位置,即遵循 Proximity原则,将相关操作保持在一起。