Pointers 指针的内存分配

Pointers 指针的内存分配,pointers,memory,memory-management,Pointers,Memory,Memory Management,如果我写了类似这样的内容,将在其中分配内存 我的理解是,当我们使用关键字new时,内存被保留到堆中,而保留的内存地址被返回 但是如果我们没有使用关键字new会发生什么呢??在哪里分配内存 两种语法是否相同??如果否,这两个语句之间的确切区别是什么???您的代码示例可以重新表述如下: 第一: 第二: 第二种情况是: int*ptr表示创建能够存储int变量地址的变量。目前,变量尚未初始化,所以它存储垃圾。如果将垃圾解释为指针,它可以指向任何地方(可以是0、0xabcdef11、0x31323334

如果我写了类似这样的内容,将在其中分配内存

我的理解是,当我们使用关键字new时,内存被保留到堆中,而保留的内存地址被返回

但是如果我们没有使用关键字new会发生什么呢??在哪里分配内存


两种语法是否相同??如果否,这两个语句之间的确切区别是什么???

您的代码示例可以重新表述如下:

第一:

第二:

第二种情况是:

  • int*ptr表示创建能够存储int变量地址的变量。目前,变量尚未初始化,所以它存储垃圾。如果将垃圾解释为指针,它可以指向任何地方(可以是0、0xabcdef11、0x31323334,也可以是以前使用过的未清除内存中的任何内容)
  • ptr=newint表示“分配能够容纳int的内存区域,并将其地址存储在ptr变量中”。由于这一行,ptr指向特定的内存
  • *ptr=22表示将值22放入ptr指向的存储器
  • 在第一个示例中,创建变量,但不初始化它
    ptr
    包含垃圾,但您要求将其解释为地址并将22存储到此地址。可能发生的情况:

    • 地址无效(例如0,或超出地址范围,或指向受保护内存)=>程序崩溃
    • 地址是有效且可写的,但内存区域被程序的另一部分使用:您将写入22,但它将损坏某人的数据,结果完全不可预测
    • 地址有效且可写,内存区未使用。你会写22,但你不能保证会读回来。内存可用于不同的目的,22将被覆盖
    • 还有别的吗。所有这一切实际上是一种未定义的行为,一切皆有可能
    这就是为什么总是建议立即初始化指针:

    int * ptr = NULL; //or better "nullptr" starting from C++11
    

    尝试存储值
    *ptr=22
    至少会显式地使程序崩溃。

    您的代码示例可以重新表述如下:

    第一:

    第二:

    第二种情况是:

  • int*ptr表示创建能够存储int变量地址的变量。目前,变量尚未初始化,所以它存储垃圾。如果将垃圾解释为指针,它可以指向任何地方(可以是0、0xabcdef11、0x31323334,也可以是以前使用过的未清除内存中的任何内容)
  • ptr=newint表示“分配能够容纳int的内存区域,并将其地址存储在ptr变量中”。由于这一行,ptr指向特定的内存
  • *ptr=22表示将值22放入ptr指向的存储器
  • 在第一个示例中,创建变量,但不初始化它
    ptr
    包含垃圾,但您要求将其解释为地址并将22存储到此地址。可能发生的情况:

    • 地址无效(例如0,或超出地址范围,或指向受保护内存)=>程序崩溃
    • 地址是有效且可写的,但内存区域被程序的另一部分使用:您将写入22,但它将损坏某人的数据,结果完全不可预测
    • 地址有效且可写,内存区未使用。你会写22,但你不能保证会读回来。内存可用于不同的目的,22将被覆盖
    • 还有别的吗。所有这一切实际上是一种未定义的行为,一切皆有可能
    这就是为什么总是建议立即初始化指针:

    int * ptr = NULL; //or better "nullptr" starting from C++11
    

    尝试存储值
    *ptr=22
    至少会显式地使程序崩溃。

    int*ptr=22会将
    22
    解释为指针。这可能不会指向有效内存,当然也不会保留它。好吧,愚蠢的错误。但是,如果它就像int*ptr,那么当您只声明一个指针时,不会分配额外的内存;和其他变量一样。一个
    intnum将为其保留空间(可能在堆栈上,也可能不是)<代码>int*ptr相同。
    int*ptr=22会将
    22
    解释为指针。这可能不会指向有效内存,当然也不会保留它。好吧,愚蠢的错误。但是,如果它就像int*ptr,那么当您只声明一个指针时,不会分配额外的内存;和其他变量一样。一个
    intnum将为其保留空间(可能在堆栈上,也可能不是)<代码>int*ptr是相同的。
    
    int * ptr;
    ptr = new int; //the only difference
    *ptr = 22;
    
    int * ptr = NULL; //or better "nullptr" starting from C++11