C++ 高手求助解决。

边缘998 2012-03-27 02:01:09
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已是野指针了?

求正确的处理方法。

...全文
198 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
likejieicy 2012-03-28
  • 打赏
  • 举报
回复
这个题目 不需要高手解决。。。完全属于 C++基础语法层面。。。
DeDeWo 2012-03-27
  • 打赏
  • 举报
回复
撒分~~~~~~~~~~~
昨夜无风 2012-03-27
  • 打赏
  • 举报
回复
实践出真知
边缘998 2012-03-27
  • 打赏
  • 举报
回复
结贴,服务器不响影。。。。。。。
晚上再结吧。
可能以为我刷分的。
边缘998 2012-03-27
  • 打赏
  • 举报
回复
给,分而已嘛,好赚。
shn521 2012-03-27
  • 打赏
  • 举报
回复
给分吧,最近押分,输了不少
shn521 2012-03-27
  • 打赏
  • 举报
回复
是这样的
边缘998 2012-03-27
  • 打赏
  • 举报
回复
理解完全正确,我已验证过了。
边缘998 2012-03-27
  • 打赏
  • 举报
回复
哈哈,搞几下,把我自己都搞明白了。还搞出来一个内存泄漏的问题。
大哥,我理解的对不对啊。
边缘998 2012-03-27
  • 打赏
  • 举报
回复
指针本身不用删除,因为指针本身在栈中,函数执行完指针本身就没了,而动态内存是在堆中,需要删除。

按照这个说法的话,哪么在B=A;之后,B原来指向的地址了,也就是游离了,之后想删除也不可能了。哪么就内存泄漏了。

哪为了避免内存泄漏,不应该进行B=A的操作。而应该这样搞。
Cpointer * A = new Cpointer(10);
CPointer * B;
B = A;
因为B没有New所以只是申请了一个内存空间。所以只需要DELETE A就可以了,这样就不会有内存泄漏了。
shn521 2012-03-27
  • 打赏
  • 举报
回复
cout<<"A Pointer ="<<A<<endl; 输出的是指针的值
cout<<"&A Pointer ="<<&A<<endl; 是存指针的地址
delete只是删除A指向的内存,但不删除A的值,所以能输出指针A的值
边缘998 2012-03-27
  • 打赏
  • 举报
回复
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本身的指地,仍存在。
请按任意键继续. . .
shn521 2012-03-27
  • 打赏
  • 举报
回复
CPointer* A = new CPointer(); 定义了一个指针,假设地址是1000,地址1000存的是指针,指针的值指向动态申请的内存。
shn521 2012-03-27
  • 打赏
  • 举报
回复
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
shn521 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fengsh998 的回复:]
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<……
[/Quote]
好像是这样的
指针本身不用删除,因为指针本身在栈中,函数执行完指针本身就没了,而动态内存是在堆中,需要删除。
边缘998 2012-03-27
  • 打赏
  • 举报
回复
判断空?
是这样吗?

delete A;
A = NULL;

if(B)
{
delete B;
B = NULL;
}

哪么我可以说这个B你永远判都是这TRUE。不信你自己试一下。看一下B指向的空间,在原来A指向的空间。
sevancheng 2012-03-27
  • 打赏
  • 举报
回复
delete 了两次,有什么好说的

记得delete前要判空,delete后要置空
边缘998 2012-03-27
  • 打赏
  • 举报
回复
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都不会反映指针的内存删除,只是删除指针指向的内存。
哪么这个指针本身的内存如何删除?
Kaile 2012-03-27
  • 打赏
  • 举报
回复
用智能指针可避免这个问题
shn521 2012-03-27
  • 打赏
  • 举报
回复
delete只是删除指针指向的内存,并不删除指针本身,所以一般delete指针后,要把指针设置为NULL或0的
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧