Pointers 类对象销毁

Pointers 类对象销毁,pointers,visual-c++,null,delete-operator,Pointers,Visual C++,Null,Delete Operator,在下面的代码中,我特意在删除后将指针p设置为NULL,以便第二个对象不能再次删除它。但是,我在Microsoft Visual C++中收到以下错误对话框: 调试断言失败-表达式:\u BLOCK\u TYPE\u有效(pHead->nBlockUse) #包括 #包括 使用名称空间std; 班级线{ 公众: 第()行; ~line(); int*p; }; 行::行(){ p=新整数; } 行::~line() { 如果(p!=NULL) { 删除p; p=零; } } int main()

在下面的代码中,我特意在删除后将指针
p
设置为
NULL
,以便第二个对象不能再次删除它。但是,我在Microsoft Visual C++中收到以下错误对话框:
调试断言失败-表达式:\u BLOCK\u TYPE\u有效(pHead->nBlockUse)

#包括
#包括
使用名称空间std;
班级线{
公众:
第()行;
~line();
int*p;
};
行::行(){
p=新整数;
}
行::~line()
{
如果(p!=NULL)
{
删除p;
p=零;
}
}
int main()
{
第1行,
line2=line1;

cout
line1
line2
都拿着一个指针

您需要了解
line1.p
line2.p
的一个单独变量,即使它们指向内存中的相同地址

假设先调用
line2
析构函数。它将
line2.p
设置为NULL,但这不会改变
line1.p
指向的位置

当随后调用
line1
析构函数时,它将尝试解除分配
line1.p
指向的已解除分配的数据,从而产生调试断言

#include <iostream>
#include <string>
using namespace std;

class line{
public:
    line();
    ~line();
    int* p;
};

line::line(){
    p = new int;

}

line::~line()
{
    if (p != NULL)
    {
        delete p;
        p = NULL;
    }
}


int main()
{
    line line1,
        line2 = line1;
    cout << line1.p << endl << line2.p;

    cin.get();
    return 0;
}