替代C/C++ localtime()

Dan*_*Dan 0 c++ windows visual-studio c++11

我正在尝试使用以下代码获取C++中的当前本地时间:

time_t rawtime;
struct tm * timeinfo;

time (&rawtime);
timeinfo = localtime (&rawtime);
Run Code Online (Sandbox Code Playgroud)

不幸的是,当使用消息_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;
}
Run Code Online (Sandbox Code Playgroud)

我不知道的是B的析构函数在连接之前和线程完成其工作之前被调用.

解:

  • 时间函数(无论是来自ctime还是chrono)按预期工作
  • 通过指针或std :: ref将B传递给t_f()

来自Keith ThompsonMats Petersson的怀疑都是基础和正确的,所以我会将Keith的答案标记为正确,因为它是解决这个模糊错误的第一个良好的领导,即使我最初没有提供足够的信息.

谢谢

Kei*_*son 5

有其他选择localtime,但这不是你应该关注的重点.

我将你的代码复制到一个小程序中:

#include <ctime>
#include <iostream>
int main(void) {
    time_t rawtime;
    struct tm * timeinfo;

    time (&rawtime);
    timeinfo = localtime (&rawtime);

    std::cout << "rawtime = " << rawtime << "\n";
    std::cout << "Welcome to " << 1900 + timeinfo->tm_year << "\n";
}
Run Code Online (Sandbox Code Playgroud)

它编译并运行没有错误:

rawtime = 1376773717
Welcome to 2013
Run Code Online (Sandbox Code Playgroud)

您收到的错误消息似乎表明内存分配问题.该localtime功能可能在malloc内部使用.如果malloc由于没有足够的可用内存而失败,则返回一个空指针,该指针localtime应该能够处理.断言错误可能表明堆已损坏 - 这意味着程序中的其他内容已做坏事,可能释放您未分配或写入的数据绑定的内存以及系统用于跟踪的数据的东西.

切换到<ctime>自己<chrono>可能是个好主意,但它不是解决问题的方法.您需要跟踪并更正程序正在执行的任何破坏堆的操作.

更新:

既然解决方案应该在答案中,而不是在问题中,我在这里复制这个问题:

我不知道的是析构函数B是在连接之前和线程完成其工作之前调用的.

解:

  • 时间函数(无论是来自ctime还是chrono)按预期工作
  • 通过指针或std :: ref将B传递给t_f()

来自Keith ThompsonMats Petersson的怀疑都是基础和正确的,所以我会将Keith的答案标记为正确,因为它是解决这个模糊错误的第一个良好的领导,即使我最初没有提供足够的信息.