c++ - 在日志宏中使用 __FILE__、__LINE__ 和 __FUNCTION__ 时为 NULL_CLASS_PTR_DEREFERENCE

标签 c++ macros nullptr

我的一个程序有一个奇怪的行为。我定义了一个扩展为

的宏 LOG_FUNCTION
#define LOG_FUNCTION \
    { \
        std::string strFile = __FILE__; \
        std::string strLine = std::to_string(__LINE__); \
        std::string strFunction = __FUNCTION__; \
        logger.log(strFile + ", line " + strLine + ", " + strFunction + "()"); \
    } \
    CIndentor _indentor_(&logger);

在 Logger.h 中声明。记录器也在 Logger.h 中声明:

// Declare the one and only logger object (which is defined in Logger.cpp):
extern CLogger logger;

日志函数如下所示:

void CLogger::log(const string &strText)
{
    lock_guard<mutex> lockGuard(_mutex);

    m_count++;

    string strIndentation(m_indentation, ' ');

    string strTime = getCurrentDateTime();

    FILE* pFileStream = nullptr;
    errno_t err = fopen_s(&pFileStream, m_strLogFilePath.c_str(), "a+");
    if (err == 0)
    {
        fprintf(pFileStream, "[#%05d] [%s] %s%s\n", m_count, strTime.c_str(), strIndentation.c_str(), strText.c_str());  
        fclose(pFileStream); 
    }
}

现在有时我的程序会崩溃。 使用 windbg 检查 heapdump 这恰好发生在我在我的一个函数中调用 LOG_FUNCTION-macro 的代码行中。这并不总是发生,当然我也在其他没有发生此类崩溃的地方使用宏。仅在单个函数中(第一行):

void MyClass::SetInfoText(wstring& text)
{
    LOG_FUNCTION;  // <= this is the place where windbg says it crashes
    ...
}

任何人都可以阐明这一点吗?

编辑

在上面添加了一些代码以显示声明记录器的位置

最佳答案

NULL_CLASS_PTR_DEREFERENCE 表示带有 this 指针的东西是错误的 - thisNULL

如果在通过此 nullptr this 访问的第一个成员的空指针上调用非虚拟成员函数,则可能会发生这种情况。

您需要回顾一下堆栈并确保调用方站点不会发生这种情况。

关于c++ - 在日志宏中使用 __FILE__、__LINE__ 和 __FUNCTION__ 时为 NULL_CLASS_PTR_DEREFERENCE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47569460/

相关文章:

c++ - 关于使一个类成为另一个类的 friend 困境的 B/B+ 树的实现

c++ - 消息映射的宏定义

c - 在函数调用期间避免 sizeof 样板的宏函数

c++ - 如果语句未在SFML中输出

c++ - 尝试/捕获丢失的 vector 下标超出范围(调试断言失败)

c++ - 在 C++ 中,如果首先禁止默认构造,那么禁止复制构造是否有意义?

c++ - 为什么将音频流添加到ffmpeg的libavcodec输出容器会导致崩溃?

c++ - 特定的 C++ 宏

c++ - 未调用带有 nullptr 的重载函数

c++ - 反转指向数据成员的指针