奇怪现象:自动对象的构造析构时机不对?(vs2005)

YufengShi 2007-12-27 10:58:05
#pragma once
#include "mmsystem.h"
#pragma comment(lib, "winmm.lib")
#ifdef _DEBUG
class CTraceTime
{
public:
CTraceTime(const wchar_t* tskname)
{
m_csTskname = tskname;
CString sOutput2;
sOutput2.Format(L"%s :%010d\n", m_csTskname, timeGetTime());
OutputDebugString(sOutput2);
}
~CTraceTime()
{
CString sOutput2;
sOutput2.Format(L"%s End:%010d\n", m_csTskname, timeGetTime());
OutputDebugString(sOutput2);
}
private:
CString m_csTskname;
};
#define TRACE_TIME(x) CTraceTime(x)
#else
#define TRACE_TIME(x)
#endif

usage:
TRACE_TIME(L"test task");
TRACE(L"between task");

vs2005编译输出:
test task bgn:xxx
test task end:xxx
between task

期望的输出结果应该是:
test task bgn:xxx
between task
test task end:xxx

很显然,对象过早析构了,对此我很是不解!
在此寻求答案。
...全文
48 点赞 收藏 5
写回复
5 条回复
jameshooo 2007年12月28日
楼上几位都对。编译器处理临时变量就是这样做的,语句执行完毕马上析构临时变量。
回复 点赞
superarhow 2007年12月28日
同意楼上二位观点。
#define TRACE_TIME(x) CTraceTime(x)
===>
#define TRACE_TIME(x) CTraceTime __var(x)
回复 点赞
YufengShi 2007年12月28日
确实是临时变量的生命期问题。解决了,结贴。
回复 点赞
zhoujianhei 2007年12月28日
你只是调用了构造函数,当构造函数返回时,发现没有变量对象,就又调用了析构函数。
回复 点赞
healer_kx 2007年12月27日
因为你生成了一个的对象的生存周期就是那一条语句啊,你没有任何变量去引用它,并不会延长它的生存周期。
编译器就直接编译为call ctor, call destor了。
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7889

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告