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

C++ 为什么内存位置被分配了垃圾值?,c++,memory,memory-management,C++,Memory,Memory Management,我一直想知道为什么内存空间中会存储垃圾值。为什么记忆中不能充满零呢。有什么特别的原因吗 例如: int a ; cout<<a //garbage value displayed inta; cout现代OSs在进程首次访问内存之前将内存初始化为0。但一旦它被使用,除非有特殊的需要,否则通常没有必要再次调零。“垃圾值”就是上次写入该内存的内容。因为清除内存(或者确实是这样)代价很高,而且在大多数常见情况下不需要 在本例中,您展示了它的堆栈内存。每次将此值归零的代价太高(基本上每个函

我一直想知道为什么内存空间中会存储垃圾值。为什么记忆中不能充满零呢。有什么特别的原因吗

例如:

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

cout现代OSs在进程首次访问内存之前将内存初始化为0。但一旦它被使用,除非有特殊的需要,否则通常没有必要再次调零。“垃圾值”就是上次写入该内存的内容。

因为清除内存(或者确实是这样)代价很高,而且在大多数常见情况下不需要

在本例中,您展示了它的堆栈内存。每次将此值归零的代价太高(基本上每个函数调用都必须清除一块内存)。

出于(大部分是历史)性能原因。将以后分配了适当值的内存位置归零是不必要的工作,c/c++的口号之一是“你不需要为你不需要的东西付费”

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

编辑:如果您的问题是垃圾数据来自何处:它只是以前存储在同一物理地址的数据。比方说,您直接依次调用以下两个函数:

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

int main() {
    foo1();
    foo2();
}
void foo(){
INTA=5;
}
void foo2(){
int b;

STD::CUT

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

int a;
std::cin >> a;

为什么要浪费一个零点到内存中,当你要做的第一件事是存储一个不同的值时?

< p>你所得到的垃圾值是以前存储在那个地址中的值。但是在C++中(和许多其他语言),将它们全部初始化为零是一项非常昂贵的任务,而编译器不会这样做。这将浪费编译器本可以用于其他目的的大量时间。因此,分配新值不是由编译器完成的

< >但是还有其他编译器将它们初始化为0,但是C++不是其中之一。 通常,编译器会希望您给新变量一个新值

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

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


如果您在访问它们之前没有给它们赋值,编译器将给您一个关于未初始化变量的警告。(如果您打开了编译器警告).

垃圾值来自内存空间中存在的内容。在您的情况下,您只声明了变量而没有对其进行初始化。当声明了变量而没有初始化时,内存会分配给该变量,但不会清除,主要是出于性能原因。因此,它可能包含您不期望的初始值它需要包含,这可能有几个原因。根据第10章,有几个原因包括:

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

一个好的做法是声明并初始化一个变量,使其尽可能接近最初使用的位置,即通过将相关操作保持在一起来遵循接近原则。

@marglisse-induct-meYou应该阅读@KarolyHorvath:当然它仍然有它的优点,但现在的实例要少得多(与c相比)无法在声明点正确初始化变量的情况下,以及在仍然正确的情况下(如作者示例)在大多数系统中初始化局部变量的成本其实并不算大。如果C++是现在设计的,不需要向后兼容,那么我想它们在很多事情上的决定可能是不同的。,在不必要的零初始化将发生的情况下,编译器可能会证明,该位置仅在写入之后才从中读取,因此在这些情况下,初始化可能会被悄悄地放弃。“的成本真的没有那么大”-对于几乎所有其他因不使用而不付费的功能,也可以证明同样的论点。这些小东西很重要-例如,当你处于一个紧密循环中时:额外的指令或过程调用可以产生很大的不同。此外,这些小东西可以加起来很多…至于语言是什么。。我不想发表评论-这纯粹是猜测。请给我看一个紧密的循环,其中a)你不能立即初始化变量b)编译器不能立即优化初始化c)你负担不起初始化成本。再说一次,我不是说,它没有好处,我只是相信-主要是由于更好的编译器-它可以问题远没有大多数人想象的那么严重。@KarolyHorvath:另一方面,你当然可以问默认为零的策略会给你带来什么。今天从未初始化的内存位置读取的代码很可能仍然有问题,即使读取总是返回零。这只会对人们产生影响这是来自java的,它期望它是零。@ MoHIbBasHi。不,垃圾是因为没有任何东西被完成,所以内存包含了任何随机值已经发生。为了说明,尝试“静态int A;在C++中有完全定义行为的CUT(我怀疑你知道))。-但是需要初始化变量。如果没有
静态
,它会变得更有趣。
int a;
std::cin >> a ;