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已是野指针了?求正确的处理方法。
{
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已是野指针了?求正确的处理方法。
解决方案 »
- 对话框间通信
- opencv 2.x 中 用 Mat 存储数据问题
- 关于DrawText的排版错位?
- 我使用SkinMagic出现问题,谁能帮助我?
- 高手来指点下!我是用InstallShield for Microsoft Visual C++ 6打包程序,但为什么打包时会把我要安装的应用程序***.exe和***.dll等文件
- 郁闷了好长时间了~,CompatibleDC的问题~
- 急!!在线等待:如何得到弹出的对话框的位置和大小??
- 急,不知道什么原因,编译的时候说我的IDD_DIALGO1没有声明!
- 关于菜单的小问题!!大家帮忙看看!
- CRecordset问题:符合查询条件的记录有多少,为什么我只能得到第一个记录?
- execl文件操作:功能是由Sheet1中数据,生成一个新表SheetXX
- 多线程开发上的问题:怎么能在线程里读取office文档的内容(ole方法)
我现在在想为什么执行B=A的时候,不能删除两次。如果我要把A删除不影响B的删除的。我要如何做,重载运算符?但重载运算符对指针不起作用,只是对象起作用。高手呢,出来吧。
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都不会反映指针的内存删除,只是删除指针指向的内存。
哪么这个指针本身的内存如何删除?
是这样吗?delete A;
A = NULL;if(B)
{
delete B;
B = NULL;
}哪么我可以说这个B你永远判都是这TRUE。不信你自己试一下。看一下B指向的空间,在原来A指向的空间。
{
delete B;
B = NULL;
}
“哪么我可以说这个B你永远判都是这TRUE”
是因为只是把A指向的地址给了B,A=NULL,并不代表B就等于NULL
例如
int a=5 int b=6
a=b b=0
但a并不等于0
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本身的指地,仍存在。
请按任意键继续. . .
cout<<"&A Pointer ="<<&A<<endl; 是存指针的地址
delete只是删除A指向的内存,但不删除A的值,所以能输出指针A的值
Cpointer * A = new Cpointer(10);
CPointer * B;
B = A;
因为B没有New所以只是申请了一个内存空间。所以只需要DELETE A就可以了,这样就不会有内存泄漏了。