次のコードを使用して、C++ で現在の現地時間を取得しようとしています。
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
残念ながら、メッセージ _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) で localtime (__getgmtimebuf -> _malloc_crt のどこか) を呼び出すと、「debug assertion failed」が表示されます。
コンパイルフラグが必要ですか(vs 2012をc ++ 11で使用しています)?
そうでない場合、どのような代替手段がありますか?
コード全体を投稿することはできず、コンテキストをさらに分離することは容易ではありません。エラーは時間関数からではなく、残りのロジック (別のプロジェクトで動作するため) からのもののようです。原因を突き止めようとしますが、それでもエラーはわかりにくいと感じます。
私がしていたことは次のようなものでした:
#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 の答えは正しいとマークします。
ありがとうございました