如何在C ++中删除指针,我该怎么理解

时间:2011-12-27 22:27:43

标签: c++ pointers memory delete-operator

当我编写这样的代码时,它会打印“未删除”。我怎样才能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;

7 个答案:

答案 0 :(得分:4)

在指针上调用delete不会将指针本身设置为NULL(为什么要这样?你会意识到,鉴于delete的签名,它不可能这样做,即它需要{{1不是void*)。

为什么(想你)需要这个?您不需要检测这种情况,只需构造代码,以便确定地释放内存。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

你没有“删除”一个指针,你删除指针所指的是什么。

答案 3 :(得分:1)

安排你的代码:

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

PS。不要使用RAW指针。

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

或者

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

答案 4 :(得分:0)

删除指针不会将其设置为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;

答案 5 :(得分:0)

为什么不使用valgrind通过实验“证明”应用程序没有内存泄漏 - 证明所有节点都已被删除并且其内容已被删除?

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

答案 6 :(得分:0)

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

那是。如果你正在使用C ++,你想要控制何时你有安全感,你如何拥有它,以及你想要不安全的地方。

当您手动删除指针时,绝对没有迹象表明指针已被删除。这就是为什么大多数现代C ++文本都会告诉你,除非你有其他特殊原因,不要使用裸指针。您不应该手动删除所有指针,除非您有一些特定的理由这样做。

如果您正在制作数据结构,那么您需要这种数据结构的安全性。请注意,C ++标准库数据结构允许迭代器(通用指针)在某些条件下变为无效。这使用户的责任知道他们正在做什么。

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

C ++并不安全。当然不安全;这是C ++。但它