我正在尝试使用以下代码在 C++ 中获取当前本地时间:
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
不幸的是,当使用消息 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 调用本地时间(在 __getgmtimebuf -> _malloc_crt 中的某处)时,我得到“调试断言失败”。
我是否遗漏了什么,我需要一些编译标志(我正在使用带有 c++11 的 vs 2012)吗?
如果没有,我还有什么选择?
我无法发布整个代码,并且隔离更多上下文并不容易。似乎错误不是来自时间函数,而是来自其余逻辑(因为它们在单独的项目中工作),我会尝试找出导致它的原因,但我仍然觉得错误有点模糊。
我正在做的是这样的:
#include <iostream>
#include <chrono>
#include <ctime>
#include <string>
#include <thread>
class A
{
public:
void time()
{
//time_t rawtime;
//struct tm * timeinfo;
//time (&rawtime);
//timeinfo = localtime (&rawtime);
time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::cout << std::ctime(&now);
}
};
class B
{
public:
void run(A *a)
{
this->a = a;
this->t = new std::thread(t_f, *this);
this->t->join();
}
~B()
{
delete t;
delete a;
}
friend void t_f(B &b);
private:
A *a;
std::thread *t;
};
void t_f(B &b)
{
b.a->time();
}
int main()
{
B b;
b.run(new A());
return 0;
}
我不知道的是 B 的析构函数在连接之前和线程完成工作之前被调用。
解决方案:
- 时间函数(无论是来自 ctime 还是 chrono)按预期工作
- 通过指针或 std::ref 将 B 传递给 t_f()
Keith Thompson和Mats Petersson的两个怀疑都是有根据的并且是正确的,所以我会标记 Keith 的答案是正确的,因为它是解决这个晦涩错误的第一个好线索,即使我最初没有提供足够的信息。
谢谢