如何在C ++中检查指针是否被删除

时间:2018-03-27 09:16:04

标签: c++ pointers

我在C ++中编写了以下数组指针程序。我删除了指针,但我无法确认指针是否被删除。 提前谢谢!

#include<iostream>
using namespace std;

int main()
{
    int *p;
    p=new int[10];
    int i=0;

if(!p)
{
    cout<<"\ndynamic memory allocation failed"<<endl;
}

cout<<&p;

for(i=0;i<10;i++)
{
    p[i]=i+1;
}

for(i=0;i<10;i++)
    cout<<"\nvalue of pointer p="<<p[i];


delete[] p;
if(!p)
    cout<<"\n\nmemory cannot be free";
}

2 个答案:

答案 0 :(得分:3)

  

如何在C ++中检查指针是否被删除

无法在C ++中检查指针是否被删除。

也无需检查指针是否被删除。如果你从new-expression获得一个指针,而你之前还没有删除指针,那么可以安全地假设delete会释放那个内存。

  

它不是信任编译器。我只是想确认它是否被删除。如果删除它的好,但如果它没有删除那么......

由于无法测试指针是否已被删除,因此诀窍是构造程序,以便永远不会怀疑指针的状态。

典型的解决方案是将指针存储为描述为&#34;智能指针&#34;的类的私有成员变量,并且永远不要让该类的任何函数的post条件将指针保留在删除状态。这建立了一个类不变量,它保证指针在整个生命周期内的有效性,因此永远不需要找出何时可以删除指针。

标准库为您提供智能指针类,因此几乎不需要自己编写deletedelete[]

如果您使用动态数组作为示例,则不需要使用任何指针。您可以改为使用std::vector

{
    std::vector<int> p(10);
}
// memory was freed; no need to test

答案 1 :(得分:1)

如果你想确定你删除的指针不包含不安全的值,你可以确保在之后将它设置为nullptr。

delete[] p;
p = nullptr;

如果您想查看它是否已删除,只需查看:

if (p != nullptr)
{
}

希望这有帮助!