Pointers 指针的内存分配
如果我写了类似这样的内容,将在其中分配内存 我的理解是,当我们使用关键字new时,内存被保留到堆中,而保留的内存地址被返回 但是如果我们没有使用关键字new会发生什么呢??在哪里分配内存Pointers 指针的内存分配,pointers,memory,memory-management,Pointers,Memory,Memory Management,如果我写了类似这样的内容,将在其中分配内存 我的理解是,当我们使用关键字new时,内存被保留到堆中,而保留的内存地址被返回 但是如果我们没有使用关键字new会发生什么呢??在哪里分配内存 两种语法是否相同??如果否,这两个语句之间的确切区别是什么???您的代码示例可以重新表述如下: 第一: 第二: 第二种情况是: int*ptr表示创建能够存储int变量地址的变量。目前,变量尚未初始化,所以它存储垃圾。如果将垃圾解释为指针,它可以指向任何地方(可以是0、0xabcdef11、0x31323334
两种语法是否相同??如果否,这两个语句之间的确切区别是什么???您的代码示例可以重新表述如下: 第一: 第二: 第二种情况是:
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如果编译的话,code>会将22
解释为指针。这可能不会指向有效内存,当然也不会保留它。好吧,愚蠢的错误。但是,如果它就像int*ptr,那么当您只声明一个指针时,不会分配额外的内存;和其他变量一样。一个intnum例如,code>将为其保留空间(可能在堆栈上,也可能不是)<代码>int*ptr代码>相同。int*ptr=22如果编译的话,code>会将22
解释为指针。这可能不会指向有效内存,当然也不会保留它。好吧,愚蠢的错误。但是,如果它就像int*ptr,那么当您只声明一个指针时,不会分配额外的内存;和其他变量一样。一个intnum例如,code>将为其保留空间(可能在堆栈上,也可能不是)<代码>int*ptr代码>是相同的。
int * ptr;
ptr = new int; //the only difference
*ptr = 22;
int * ptr = NULL; //or better "nullptr" starting from C++11