【问题标题】:C++ after delete pointer删除指针后的C++
【发布时间】:2021-07-30 09:47:12
【问题描述】:

删除ptr后,cout << ptr是否打印int(6)的地址?

如果是这样,为什么会出现乱码?我记得delete只会释放指定空间的数据,不是吗?

还有想问一下delete这里什么时候释放空间数据,是只释放6还是int类型?

int* ptr = new int(6);
cout << "Address of the space pointed to by ptr: " << ptr << endl;
cout <<"the value of the space pointed to by ptr: "<< *ptr << endl;
delete ptr;
cout << ptr << endl;

【问题讨论】:

  • delete 命令仅释放该指针正在使用的内存。所以它只会释放值 6 而不是 int 类型。
  • delete ptr 释放ptr 指向的内存(创建为new int (6))。它不会更改该指针的值。所以cout &lt;&lt; ptr 将打印与执行delete ptr 之前相同的(指针的)值。如果您在完成delete ptr 之后打印*ptr,则行为未定义(这意味着它可以打印值6,它可以打印“垃圾”,但结果也可能是重新格式化您的硬盘驱动器 - 未定义的行为表示任何结果都是可能的)。
  • 指针就是一个存储单元的编号。在古老的 K&R C 中,int 和指针之间并没有太大的区别。后来,这被重新定义了,当然,因为混淆指针和值是一个很容易犯的错误,但会产生严重的后果。但是,指针是指针。删除内容(指针指向的位置)是一回事,但它不会改变指针本身。但是,如果您在删除后访问指针的内容 - 那将是未定义的行为。
  • 删除ptr后,如果继续使用会发生什么,还不确定。

标签: c++ pointers


【解决方案1】:

int* ptr = new int(6); 保留ptr 将指向的一些内存,该内存可以很好地存储int6 或任何其他内存,它不能用于做任何其他事情,您可以可靠地存储那里的数据并在以后访问它。

在您delete 之后,您告诉系统该内存可用,并且程序可以将其用于任何其他用途。 ptr 可能仍然指向同一个地址(指针的)并且您仍然可以打印它,但是该内存不再属于ptr,通过它访问该内存(eg:取消引用指针),相当于undefined behavior

指针的值(它指向的地址)通常保持不变,直到你自己改变它。

一种常见的做法是将nullptr 分配给一个不指向任何有效内存位置的指针,这样您就可以轻松检查它是否可以被取消引用。

【讨论】:

  • delete ptr 之后访问ptr(例如打印它)不会导致未定义的行为,因为它的值保持不变。取消引用它(即将ptr 的值视为有效对象的地址,但它不再是)会导致未定义的行为。
  • @anastaciu 但是当我 delete ptr 并打印它时。和delete之前的ptr不一样,不知道为什么
  • @timeil0611,可以不一样,delete后面的指针没有强制保持原来的值,VS没有错,虽然很不寻常。其他编译器不会费心改变指针值。
  • @Peter,那可能并不总是这样,指针值可能会被编译器更改,MSVC 习惯这样做stackoverflow.com/q/33374483/6865932
【解决方案2】:

嗯,ptr 是对内存中 4 字节的引用。 int* ptr = new int(6); 代码将一个内存块分配给 ptr 并将 6 写入该内存块。

delete ptr; 代码告诉编译器带有 ref ptr 的存储块被释放。因此,具有 ref ptr 的存储块可以满足对存储块的进一步请求。在delete ptr; 之后,值 6 并没有从内存中删除 ref ptr。

在进一步请求内存位置时,例如代码int *newptr = new int; ref ptr 可以分配给 newptr。

int* ptr = new int(6);

cout << "Address of the space pointed to by ptr: " << ptr << endl;
cout <<"the value of the space pointed to by ptr: "<< *ptr << endl;

delete ptr;

cout << ptr << endl;[enter image description here][1]
cout << *ptr << endl;

*ptr = 7;
cout << *ptr << endl;

int *newptr = new int;

cout << "new ptr = " << newptr << endl;

运行此代码以更好地理解。

【讨论】:

    【解决方案3】:

    调用delete ptr; 后,ptr 的值不确定。 (请注意,取消引用指针的行为是未定义的)。

    好像你写的一样

    int* ptr;
    

    没有初始化,然后读取指针

    cout << ptr << endl;
    

    【讨论】:

    • 不正确。 delete ptr 导致ptr 指向的对象(例如*ptr)不再是有效对象。它不会改变ptr 的值,因此不会导致ptr 的值变得不确定。
    【解决方案4】:

    指针是一个包含另一个变量地址的变量,在这种情况下,ptr 用匿名 int 变量的地址初始化。

    Delete 释放分配给匿名 int 的内存,但由于 ptr 是按值传递的,它的值不会改变 - 它仍然包含以前由 int 占用的相同地址。

    因此,您可以在调用 delete 后打印变量 ptr 的内容,这将为您提供所说的地址,但访问该地址(取消引用 ptr)是未定义的行为。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多