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;
coutline1
和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;
}