class CPointer
{
public:
CPointer();
~CPointer();
};// CPointer
CPointer::CPointer()
{
cout<<"CPointer Is Called"<<endl;
}CPointer::~CPointer()
{
cout<<"~CPointer Is Called"<<endl;
}在main方法中进行测试
int _tmain(int argc, _TCHAR* argv[])
{
CPointer* A = new CPointer();
CPointer* B = new CPointer(); B = A; delete A;
delete B; system("pause");
return 0;
}结果报错。难道不能进行B=A;的操作吗?
难道我Delete A的时候,B已是野指针了?求正确的处理方法。

解决方案 »

  1.   

    很明显同一个地址不能delete两次的。
      

  2.   

    执行B=A操作,这个就表明是同一地址了?NEW A,NEW B的时候是开辟了两个地址空间的,这个毫无疑问的。
    我现在在想为什么执行B=A的时候,不能删除两次。如果我要把A删除不影响B的删除的。我要如何做,重载运算符?但重载运算符对指针不起作用,只是对象起作用。高手呢,出来吧。
      

  3.   

    如果我要把A删除不影响B的删除的那就不用删除A指向的内存(delete),直接把A=NULL;就行了
      

  4.   

    delete只是删除指针指向的内存,并不删除指针本身,所以一般delete指针后,要把指针设置为NULL或0的
      

  5.   

    CPointer* A = new CPointer();
    CPointer* B = new CPointer(); cout<<"A Pointer ="<<A<<endl;
    cout<<"&A Pointer ="<<&A<<endl;
    cout<<"B Pointer ="<<B<<endl;
    cout<<"&B Pointer ="<<&B<<endl;
    B = A; cout<<"A Pointer ="<<A<<endl;
    cout<<"&A Pointer ="<<&A<<endl;
    cout<<"B Pointer ="<<B<<endl;
    cout<<"&B Pointer ="<<&B<<endl;
    //delete A;
    A = NULL;
    //delete B;
    B = NULL;
    cout<<"A Pointer ="<<A<<endl;
    cout<<"&A Pointer ="<<&A<<endl;
    cout<<"B Pointer ="<<B<<endl;
    cout<<"&B Pointer ="<<&B<<endl;我发现使用A=NULL,和Delete A都不会反映指针的内存删除,只是删除指针指向的内存。
    哪么这个指针本身的内存如何删除?
      

  6.   

    delete 了两次,有什么好说的 记得delete前要判空,delete后要置空
      

  7.   

    判断空?
    是这样吗?delete A;
    A = NULL;if(B)
    {
       delete B;
       B = NULL;
    }哪么我可以说这个B你永远判都是这TRUE。不信你自己试一下。看一下B指向的空间,在原来A指向的空间。
      

  8.   

    if(B)
    {
      delete B;
      B = NULL;
    }
    “哪么我可以说这个B你永远判都是这TRUE”
    是因为只是把A指向的地址给了B,A=NULL,并不代表B就等于NULL
    例如
    int a=5   int b=6
    a=b   b=0
    但a并不等于0
      

  9.   

    CPointer* A = new CPointer();  定义了一个指针,假设地址是1000,地址1000存的是指针,指针的值指向动态申请的内存。
      

  10.   

    CPointer* A = new CPointer(10);
    CPointer* B = new CPointer(20); cout<<"A Pointer ="<<A<<endl;
    cout<<"&A Pointer ="<<&A<<endl;
    cout<<"B Pointer ="<<B<<endl;
    cout<<"&B Pointer ="<<&B<<endl;
    A->show();
    B->show();
    B = A; cout<<"A Pointer ="<<A<<endl;
    cout<<"&A Pointer ="<<&A<<endl;
    cout<<"B Pointer ="<<B<<endl;
    cout<<"&B Pointer ="<<&B<<endl;
    A->show();
    B->show();
    delete A;
    A = NULL;
    //delete B;
    //B = NULL; //B->show();
    cout<<"A Pointer ="<<A<<endl;
    cout<<"&A Pointer ="<<&A<<endl;
    cout<<"B Pointer ="<<B<<endl;
    cout<<"&B Pointer ="<<&B<<endl;
    结果:
    CPointer Is Called
    CPointer Is Called
    A Pointer =0039BC88           //A指向的内存地址
    &A Pointer =0012FE80          //A本身的指针地址
    B Pointer =0039BCC8           //B指向的内存地址
    &B Pointer =0012FE74          //B本身的指针地址
    value = 10                     //在未进行B=A的操作前,可见值不相互影响
    value = 20
    A Pointer =0039BC88           //执行B=A后,A指向的内存地址
    &A Pointer =0012FE80          //A自身的指针地址
    B Pointer =0039BC88           //由于B=A,B指向了A指向的内存地址
    &B Pointer =0012FE74          //B本身的指针地址
    value = 10                    //可见B现在取的内容出来正是A指向的内存地址中的内容
    value = 10
    ~CPointer Is Called
    A Pointer =00000000           //进行删除A 同时A=NULL;后。可见A指向的内容被删除了。
    &A Pointer =0012FE80          //A本身指针的地址还存在。这个没有影响????B Pointer =0039BC88           //但B指向的地址(即原来A指向的地址为什么不会是00000000)&B Pointer =0012FE74          //B本身的指地,仍存在。
    请按任意键继续. . .
      

  11.   

    cout<<"A Pointer ="<<A<<endl;          输出的是指针的值
    cout<<"&A Pointer ="<<&A<<endl;        是存指针的地址
    delete只是删除A指向的内存,但不删除A的值,所以能输出指针A的值
      

  12.   

    指针本身不用删除,因为指针本身在栈中,函数执行完指针本身就没了,而动态内存是在堆中,需要删除。按照这个说法的话,哪么在B=A;之后,B原来指向的地址了,也就是游离了,之后想删除也不可能了。哪么就内存泄漏了。哪为了避免内存泄漏,不应该进行B=A的操作。而应该这样搞。
    Cpointer * A = new Cpointer(10);
    CPointer * B;
    B = A;
    因为B没有New所以只是申请了一个内存空间。所以只需要DELETE A就可以了,这样就不会有内存泄漏了。