在日志宏中使用__FILE __,__LINE__和__FUNCTION__时为NULL_CLASS_PTR_DEREFERENCE

时间:2017-11-30 09:01:42

标签: 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;

log-Function如下所示:

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
    ...
}

有人可以对此有所了解吗?

修改

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

1 个答案:

答案 0 :(得分:1)

NULL_CLASS_PTR_DEREFERENCE表示this指针错误,thisNULL

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

你需要在堆栈上退一步,并确保在调用者站点不会发生这种情况。