奇怪现象:自动对象的构造析构时机不对?(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

很显然,对象过早析构了,对此我很是不解!
在此寻求答案。
...全文
88 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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了。

16,465

社区成员

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

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

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