gpt4 book ai didi

c++ - 一个 tm 结构中的错误破坏了其他 tm 结构

转载 作者:行者123 更新时间:2023-11-27 23:59:27 25 4
gpt4 key购买 nike

我偶然发现了这种行为,想知道这是否符合预期(我觉得不对)。

我在一个特定的 tm 结构中强加了一个错误,所有其他的都被破坏了。

这是代码(精简到最低限度以重现问题)

int main()
{
cout << "----- Bug test - tm struc -----" << endl;
//--------------------------------------------

//--- Setup struct tm ---
time_t timet_Now = time(NULL);
struct tm* tm1 = localtime(&timet_Now);
struct tm* tm2 = localtime(&timet_Now);

//--- Verify OK - cout shows "28/10/2016"---
cout << tm1->tm_mday << " " << tm1->tm_mon << " " << tm1->tm_year << endl;
cout << tm2->tm_mday << " " << tm2->tm_mon << " " << tm2->tm_year << endl;

// ... so far, so good

// --- Force an error in a different tm struct (xxtm)
time_t xtimet = 1464778020000;
struct tm* xxtm = localtime(&xtimet); //<<< xxtm = null - no runtime error

//--- tm1 and tm2 are now corrupted - cout shows "-1/-1/-1"
cout << tm1->tm_mday << " " << tm1->tm_mon << " " << tm1->tm_year << endl;
cout << tm2->tm_mday << " " << tm2->tm_mon << " " << tm2->tm_year << endl;

//--- This next line crashes the application, as tm1 is corrupted
char* c = asctime(tm1);

return 0;
}

崩溃错误是:MyTest.exe 中 0x0FA520B5 (ucrtbased.dll) 处未处理的异常:将无效参数传递给认为无效参数致命的函数。

最佳答案

引用 http://en.cppreference.com/w/cpp/chrono/c/localtime

Return value

pointer to a static internal std::tm object on success, or NULL otherwise. The structure may be shared between std::gmtime, std::localtime, and std::ctime, and may be overwritten on each invocation.

换句话说,您所有的 struct tm * 最终都指向完全相同的位置。你可能想要

struct tm tm1 = *localtime(&timet_Now);

如果您要保留它一段时间,请复制一份以供使用。

Kenny Ostrom 在评论中提出了一个很好的观点。我没有处理 NULL 返回情况和复制 NULL...这不是一个好主意。

struct tm * temp = localtime(&timet_Now);
if (temp == nullptr)
{
// handle error. Throw exception, return, whatever, just don't run the next line
}
struct tm tm1 = *temp;

关于c++ - 一个 tm 结构中的错误破坏了其他 tm 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40311247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com