【问题标题】:Why pointer is not NULL after using delete in C++为什么在 C++ 中使用 delete 后指针不为 NULL
【发布时间】:2018-07-20 05:40:26
【问题描述】:

我写了这篇文章,想知道为什么“已删除”没有显示为输出。

int *p=NULL;
p=new int(10);
cout<<*p<<endl;
delete p;
if(p==NULL)cout<<"deleted"<<endl;

有人可以解释为什么在使用 delete 后它不打印以及为什么 delete 不使指针为 NULL 吗?

【问题讨论】:

  • 你有没有试过阅读delete的文档
  • delete 不是这样做的。
  • 1) 显示的代码中没有引用。你delete是一个指针,而不是一个引用。 2) delete 不会改变p 的值。它只是deletes p 指向的内存。
  • 查看delete expression 并尝试在调用后找到指针在NULL 的设置位置。
  • delete 不会将指针设置为 NULL,因为这样做会浪费 CPU 周期,因为无论如何指针都不会被再次读取。如果您希望将指针设置为 NULL,您可以自己显式地将其设置为 NULL,但由于在许多情况下您不会关心,C++ 不会强迫您为不需要的操作支付开销。

标签: c++ pointers


【解决方案1】:

这是因为当你说 delete p 时,你正在删除一个指向内存的指针,它完全删除了对你分配的新内存的引用。当您说 if p==NULL 时,您正在检查指针是否设置为 null,而实际上它指向的内存已被取消分配,因此指针未指向任何内容。这与在 C++ 中指向 NULL 并不意味着相同。

【讨论】:

  • 谢谢.. 但是如何检查指针是否指向任何内存
  • 检查指针是否p != NULL;,如果是true,则指针指向一些内存
  • @ToufiqueImam 要检查指针是否指向任何东西,请尝试输出该值。 cout
  • 那么如果指针指向任何内存,就没有像 NULL 或表达式这样的 const 值来比较指针吗?
  • @ToufiqueImam 我不知道。 C++ 与 Java 之类的语言不同,其中数组的默认值是 0 或 null,具体取决于数据类型。您能否详细说明为什么需要检查此内容以便我可以进一步为您提供帮助?
【解决方案2】:

delete 作用于指针值而不是指针变量。例如这是完全合法的

int* some_func();

delete some_func();

如您所见,这里没有变量,也没有设置为NULL

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2011-10-24
    • 2015-06-08
    • 2014-01-04
    • 2017-10-21
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多