指针的内存分配

时间:2017-02-07 12:45:11

标签: pointers memory memory-management

  

如果我写了类似

的内容,则在哪个部分分配内存
1. int *ptr;
   *ptr = 22;

 2. int *ptr = new int(22);

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以按如下方式重新编写代码示例:

第一

int * ptr;
*ptr = 22;

第二

int * ptr;
ptr = new int; //the only difference
*ptr = 22;

第二个会发生什么:

  1. int * ptr;表示能够存储int变量地址的create变量。现在变量未初始化,因此它存储垃圾。如果你将垃圾解释为指针,它可以指向任何地方(它可以是0,或0xabcdef11,或0x31323334,或者字面上任何一个留在以前使用的非清除内存中的任何内容)
  2. ptr = new int;表示“分配能够保存int的内存区域并将其地址存储在ptr变量中”。从这一行开始,ptr指向特定的内存
  3. *ptr = 22;表示将值22放入ptr。
  4. 指向的内存中

    在第一个示例中,您创建变量,但不要初始化它。 ptr包含垃圾,但您要求将其解释为地址并将22存储到此地址。会发生什么:

    • 地址无效(例如0,或超出地址范围,或指向受保护的内存)=>程序崩溃
    • 地址有效且可写,但内存区域由程序的另一部分使用:你会写22,但它会破坏某人的数据,结果完全不可预测。
    • 地址有效且可写,内存区域未使用。你会写22,但你不能保证读回来。内存可以用于不同的目的,22将被覆盖。
    • 其他任何事情。所有这些实际上都是一种未定义的行为,一切皆有可能。

    这就是为什么总是建议立即初始化指针:

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

    尝试存储值*ptr = 22;至少会明确地使程序崩溃。