我怎么能理解,如果一个指针被删除在c++

How can I understand if a pointer is deleted in C++

本文关键字:指针 一个 删除 c++ 能理解 如果      更新时间:2023-10-16

当我编写这样的代码时,它打印"not deleted"。如何100%确定指针是否被删除?

int* a = new int;
*a = 5;
delete a;
if (!a)                      //I also tried a == NULL but got same result     
    cout<<"deleted"<<endl;
else
    cout<<"not deleted"<<endl;

你不能。确保在delete指针时删除指针的所有副本,因为指针引用的内存位置可能会在以后的不同数据中被重用。

在指针上调用delete并不会将指针本身设置为NULL(为什么要这样呢?您将意识到,给定delete的签名(即,它需要void*而不是void**),它不可能这样做。

你认为你为什么需要这个?您不需要检测这种情况,只需构建代码,使内存被确定性地释放。

你不是在"删除"指针,而是在删除指针所指向的内容。

像这样安排你的代码:

{
    int* a = new int;
    *a = 5;
    delete a;
}
// a no longer exists so you know it is gone.

p。最好不要使用RAW指针。

{
   // C++03
   std::auto_ptr<int> a(new int);
   *a = 5;
}

{
   // C++11
   std::unique_ptr<int> a(new int);
   *a = 5;
}

删除指针不会将其设置为NULL,它会删除指针所指向的内存。即使你要检查内存,你也无法确定它是否空闲。换句话说,检查指针是否指向"可用"内存并不简单,当然不像a == NULL那么简单。

这就是为什么当你释放指向的内存时,将指针设置为NULL被认为是一个很好的做法::

int* a = new int;
*a = 5;
delete a;
a = NULL;
if (!a)                      //I also tried a == NULL but got same result     
    cout<<"deleted"<<endl;
else
    cout<<"not deleted"<<endl;

为什么不使用valgrind实验"证明"应用程序没有内存泄漏——证明所有节点都被删除了,它们的内容也被删除了?

Valgrind在虚拟机中运行应用程序,并跟踪堆上的所有分配和取消分配。它可以报告任何无效的内存访问,并可以配置为报告有多少内存泄漏(手动分配的内存没有被释放)。

一个简单的事实是:c++不是一种安全的语言。

很好。如果你正在使用c++,你想要控制何时安全,如何安全,以及哪里不安全。

当您手动删除指针时,绝对没有任何指针已被删除的指示。这就是为什么大多数现代c++文本会告诉你,除非你有特殊的理由,否则不要使用裸指针。你根本不应该手动删除指针,除非你有特殊的理由这样做。

如果你正在创建一个数据结构,那么你希望这个数据结构有多安全取决于你自己。注意,c++标准库数据结构允许迭代器(广义指针)在某些条件下失效。这使得用户知道他们在做什么。

这样做的好处是快速的性能。如果您不想要这种性能,那么您需要使用更安全的容器或数据结构。如果需要这种安全性,那么应该对数据结构中的元素使用智能指针。用户应该获得引用节点而不是裸指针的shared_ptr<>weak_ptr<>对象。等等

c++不安全。当然,这并不安全;这是c++。但是很好