c++ 析构函数先被调用了 为什么

RFEZGC 2010-04-02 12:06:53
class Myc{
private:
int a;

public:
Myc(){ PA("构造函数调用");}
virtual ~Myc(){ PA("析构函数调用");}
inline void f(){PA("member func");}
};
void* pmyc(){
Myc mc;
LPVOID lpv=&mc;
return lpv;
}

void main( ){

Myc* lpv=(Myc*)pmyc();

lpv->f();
PA(sizeof(Myc));
PA(sizeof(lpv));
getchar();


}
--------------------------------------------

如上面代码
PA 为 cout<<x<<endl;宏
在main调用 f()之前,析构函数被调用了,这可能是LPVOID lpv=&mc;这个语句产生了临时量吧??(解答),成员int a,主要是用来区别
PA(sizeof(Myc));
PA(sizeof(lpv));
的值。
为什么析构函数会在调用f之前被调用了,高手们解答一下,



...全文
467 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
RFEZGC 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yuzl32 的回复:]
引用 18 楼 lrqsf 的回复:
引用 17 楼 yuzl32 的回复:
指针值不存在析构的概念,对象才有,主要是你的函数里面有一个局部对象mc,当函数退出时,系统自动调用了它的析构函数。lpc仍然返回,只是返回的是无效对象地址.

--------------------------
以楼主代码为例,返回地址里的数据不能保证,个人认为析构函数只是对象生命周期完结后会被掉用的一个函数……
[/Quote]

局部栈如果出了作用域,就会被回收,如果有新的内存分配,进程内存地址空间里的就会重新将没有用过的空间分配给新分配的内存,这其中也包括那些被回收的?是不是这样
yyanglike 2010-04-06
  • 打赏
  • 举报
回复
这样的写法很危险。
yuzl32 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 rfezgc 的回复:]
局部栈如果出了作用域,就会被回收,如果有新的内存分配,进程内存地址空间里的就会重新将没有用过的空间分配给新分配的内存,这其中也包括那些被回收的?是不是这样
[/Quote]
可以简单这么理解。
yuzl32 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 rfezgc 的回复:]
引用 4 楼 rfezgc 的回复:
mc是局部变量,如果改为指针: Myc* pm= new (); 就不会调用析构吧 ,在函数域里



不是说 在堆里分配的地址 对于进程来说都是全局的吗?

在局部分配的指针,除非不去free或delete ,否则不会自动析构

c++编程思想里的,具体哪章的内容我忘了
[/Quote]
void* pmyc(){
Myc mc;
LPVOID lpv=&mc;
return lpv;
}
-------------------------

指针值不存在析构的概念,对象才有,主要是你的函数里面有一个局部对象mc,当函数退出时,系统自动调用了它的析构函数。lpc仍然返回,只是返回的是无效对象地址.
RFEZGC 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 rfezgc 的回复:]
mc是局部变量,如果改为指针: Myc* pm= new (); 就不会调用析构吧 ,在函数域里
[/Quote]


不是说 在堆里分配的地址 对于进程来说都是全局的吗?

在局部分配的指针,除非不去free或delete ,否则不会自动析构

c++编程思想里的,具体哪章的内容我忘了
RFEZGC 2010-04-04
  • 打赏
  • 举报
回复
代码还跟人品有关

yuzl32 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lrqsf 的回复:]
引用 17 楼 yuzl32 的回复:
指针值不存在析构的概念,对象才有,主要是你的函数里面有一个局部对象mc,当函数退出时,系统自动调用了它的析构函数。lpc仍然返回,只是返回的是无效对象地址.

--------------------------
以楼主代码为例,返回地址里的数据不能保证,个人认为析构函数只是对象生命周期完结后会被掉用的一个函数而已。但不能说返回的是无效对象地址。
[/Quote]
函数调用所展开的栈的内容随时会被系统改写,可以视返回的指针指向无效的对象地址.
cmo_lyl 2010-04-04
  • 打赏
  • 举报
回复
边看边学
tianya0609 2010-04-04
  • 打赏
  • 举报
回复
友情帮顶
lrqsf 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yuzl32 的回复:]
指针值不存在析构的概念,对象才有,主要是你的函数里面有一个局部对象mc,当函数退出时,系统自动调用了它的析构函数。lpc仍然返回,只是返回的是无效对象地址.
[/Quote]
--------------------------
以楼主代码为例,返回地址里的数据不能保证,个人认为析构函数只是对象生命周期完结后会被掉用的一个函数而已。但不能说返回的是无效对象地址。
RFEZGC 2010-04-02
  • 打赏
  • 举报
回复
mc是局部变量,如果改为指针: Myc* pm= new (); 就不会调用析构吧 ,在函数域里
RFEZGC 2010-04-02
  • 打赏
  • 举报
回复
顶楼上的 不要在函数里返回局部变量的指针
WaistCoat10 2010-04-02
  • 打赏
  • 举报
回复
局部临时变量,出了作用域自动析构
chen_wenyue 2010-04-02
  • 打赏
  • 举报
回复
void* pmyc(){
Myc mc;
LPVOID lpv=&mc;
return lpv;
}

这里在函数中定义的mc是个局部变量,在函数执行完成退出后,就被系统自动删除了,自然就会调用Myc的析构函数了.

不要在函数里返回局部变量的指针....切记,切记....
pengzhixi 2010-04-02
  • 打赏
  • 举报
回复
如果LZ打算靠人品吃饭的话,可以这样做,否则不要返回局部变量的指针
zhfulin 2010-04-02
  • 打赏
  • 举报
回复
貌似我操作得太少了,还没有遇到这样的问题~
blackfacewa 2010-04-02
  • 打赏
  • 举报
回复
1楼正解!!

析构一般是在对象销毁的时候系统自动调用的,所以只要你把书本上的基本概念了解了。
你自己按照这样的定义来排查,自己都可以发现问题的根源
LittleJohny 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chen_wenyue 的回复:]

void* pmyc(){
Myc mc;
LPVOID lpv=&mc;
return lpv;
}

这里在函数中定义的mc是个局部变量,在函数执行完成退出后,就被系统自动删除了,自然就会调用Myc的析构函数了.

不要在函数里返回局部变量的指针....切记,切记....
[/Quote]

正解!
Julykey 2010-04-02
  • 打赏
  • 举报
回复
析构的是临时变量,尽量不要返回指向临时变量的引用或指针。
lie1213 2010-04-02
  • 打赏
  • 举报
回复
返回了局部的指针,但是指针在作用域结束够就会指向一个未知的位置,返回这个指针后果是灾难的
加载更多回复(4)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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