struct tm* 指针删除异常

equalman 2011-02-28 09:43:03
在调试程序时发现程序退出时这个位置出错

void __cdecl __crtExitProcess (
int status
)
{
__crtCorExitProcess(status);

/*
* Either mscoree.dll isn't loaded,
* or CorExitProcess isn't exported from mscoree.dll,
* or CorExitProcess returned (should never happen).
* Just call ExitProcess.
*/

ExitProcess(status);
}
经查是全局变量释放问题,然后逐个排查发现一个取得时间设置时间的函数注视掉就没问题
...全文
689 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
equalman 2011-02-28
  • 打赏
  • 举报
回复
结贴了~还是csdn高手多,学习~谢谢了
equalman 2011-02-28
  • 打赏
  • 举报
回复
这样没有问题了 ,谢谢大家

#include "stdafx.h"
#include "time.h"
#include "vld.h"
void setTime()
{
time_t T;
struct tm *TimeP1=new struct tm;
T = time(NULL);
localtime_s(TimeP1, &T );
delete TimeP1;
}

int _tmain(int argc, _TCHAR* argv[])
{
setTime();
return 0;
}
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ccing 的回复:]
申请和释放是向对应的,你用_malloc_crt申请,就用_free_crt释放!
[/Quote]
_free_crt在dbgint.h头文件 而它是内部头文件不可用
f:\program files\microsoft visual studio 9.0\vc\crt\src\dbgint.h(25) : fatal error C1189: #error : ERROR: Use of C runtime library internal header file.
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wtx_sonery 的回复:]
localtime就是返回一个全局变量指针,在多线程下不安全。。
所以就有localtime_s函数来代替
[/Quote]
在看这个安全函数,谢谢~嘿
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 wtx_sonery 的回复:]
说了半天直接把我无视了。。闪人
[/Quote]
不好意思,看到你回复了,在查msdn
真相重于对错 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 equalman 的回复:]

引用 24 楼 visualeleven 的回复:

看到了 我看它例子就没有释放 是不是就不该释放
[/Quote]
该不该释放,要看 crt 函数 里面的具体实现,比如我在 vs2005下 你的代码,没有任何问题
vs2008 似乎 对于 内存 检测 更加严格了 , 你最好还是用_localtime_s 代替的 你的 localtime
  • 打赏
  • 举报
回复
说了半天直接把我无视了。。闪人
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 hdt 的回复:]
c++ 分配内存资源有一条原则就是,谁分配,谁负责释放, 尤其是 在 dll 中的函数 ,crt 函数也是在dll中
因为localtime函数 却要让客户负责释放 本该它 释放 咚咚, 这不合理
所以 vs 改变 用
errno_t _localtime_s(
struct tm* _tm,
const time_t *time
);
来代替
你只要
t……
[/Quote]
多谢指点~
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 equalman 的回复:]
引用 20 楼 covsno 的回复:
多搞几次localtime
你自己不会看看输出tm的地址是不是一样么么?

厉害 用了两次localtime 地址是一样的 这是为啥
[/Quote]
全局变量呗
_malloc_crt你可以再跟进去看看
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 visualeleven 的回复:]
[/Quote]
看到了 我看它例子就没有释放 是不是就不该释放
真相重于对错 2011-02-28
  • 打赏
  • 举报
回复
c++ 分配内存资源有一条原则就是,谁分配,谁负责释放, 尤其是 在 dll 中的函数 ,crt 函数也是在dll中
因为localtime函数 却要让客户负责释放 本该它 释放 咚咚, 这不合理
所以 vs 改变 用
errno_t _localtime_s(
struct tm* _tm,
const time_t *time
);
来代替
你只要
tm* t=...
time_t ta;
_localtime_s( t, &ta);
Eleven 2011-02-28
  • 打赏
  • 举报
回复

// MSDN的例子程序,不妨参考一下
// crt_localtime.cpp
// compile with: /W3
/* This program uses _time64 to get the current time
* and then uses localtime64() to convert this time to a structure
* representing the local time. The program converts the result
* from a 24-hour clock to a 12-hour clock and determines the
* proper extension (AM or PM).
*/

#include <stdio.h>
#include <string.h>
#include <time.h>

int main( void )
{
struct tm *newtime;
char am_pm[] = "AM";
__time64_t long_time;

_time64( &long_time ); // Get time as 64-bit integer.
// Convert to local time.
newtime = _localtime64( &long_time ); // C4996
// Note: _localtime64 deprecated; consider _localetime64_s

if( newtime->tm_hour > 12 ) // Set up extension.
strcpy_s( am_pm, sizeof(am_pm), "PM" );
if( newtime->tm_hour > 12 ) // Convert from 24-hour
newtime->tm_hour -= 12; // to 12-hour clock.
if( newtime->tm_hour == 0 ) // Set hour to 12 if midnight.
newtime->tm_hour = 12;

char buff[30];
asctime_s( buff, sizeof(buff), newtime );
printf( "%.19s %s\n", buff, am_pm );
}
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 covsno 的回复:]
多搞几次localtime
你自己不会看看输出tm的地址是不是一样么么?
[/Quote]
厉害 用了两次localtime 地址是一样的 这是为啥
  • 打赏
  • 举报
回复
Each call to one of these routines destroys the result of the previous call.


msdn上关于这个函数的。。。。
equalman 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wtx_sonery 的回复:]
引用 11 楼 equalman 的回复:
引用 9 楼 wtx_sonery 的回复:
搜了下
有人这么描述的
“是静态变量, 多线程CRT里一般是线程局部存储(TLS)”

这个不是静态变量啊 是在函数内申请的空间 应该有种方法释放它

你怎么确定是函数内的?

struct tm gTime;
struct tm* localtime(...) {return &……
[/Quote]
我跟踪进去瞧了瞧 localtime返回的是指针 由struct tm *ptb = _malloc_crt(sizeof(struct tm)))返回 根据它执行逻辑就相当于这么个语句
covsno 2011-02-28
  • 打赏
  • 举报
回复
多搞几次localtime
你自己不会看看输出tm的地址是不是一样么么?
ccing 2011-02-28
  • 打赏
  • 举报
回复
申请和释放是向对应的,你用_malloc_crt申请,就用_free_crt释放!
  • 打赏
  • 举报
回复
localtime就是返回一个全局变量指针,在多线程下不安全。。
所以就有localtime_s函数来代替
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 equalman 的回复:]
引用 9 楼 wtx_sonery 的回复:
搜了下
有人这么描述的
“是静态变量, 多线程CRT里一般是线程局部存储(TLS)”

这个不是静态变量啊 是在函数内申请的空间 应该有种方法释放它
[/Quote]
你怎么确定是函数内的?

struct tm gTime;
struct tm* localtime(...) {return >ime;}
不行么?
msdn上又没说要让你释放
真相重于对错 2011-02-28
  • 打赏
  • 举报
回复
localtime是不安全用
localtime_s 替代
加载更多回复(15)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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