信号 SIGSEGV,分段错误。 __strlen_avx2 () 在 ../sysdeps/x86_64/multiarch/strlen-avx2.S:65

signal SIGSEGV, Segmentation fault. __strlen_avx2 () at ../sysdeps/x86_64/multiarch/strlen-avx2.S:65

我已经转换了我的旧代码:

#define MAX_LOG_MSG 2048

在*.h文件中

typedef void (*LogMessageFunction)(char *);

在 *.cpp 文件中

static LogMessageFunction m_MessageFunctions[LastLogCount] = {NULL};

void DebugMsg(const char* fmt, ...)
{
    if (!m_MessageFunctions[DebugLevel]) return;

    char msgBuffer[MAX_LOG_MSG];
    va_list argList;
    va_start(argList, fmt);
    vsnprintf(msgBuffer, MAX_LOG_MSG, fmt, argList);
    va_end(argList);
    
    m_MessageFunctions[DebugLevel](msgBuffer);
}

进入一个动态分配的char*

void DebugMsg(const char* fmt, ...)
{
    if (!m_MessageFunctions[DebugLevel]) return;

    va_list argList;
    va_start(argList, fmt);
    size_t size = vsnprintf(NULL, 0, fmt, argList) + 1;
    va_end(argList);
    char* msgBuffer = new char[size];

    va_start(argList, fmt);
    vsnprintf(msgBuffer, size, fmt, argList);
    va_end(argList);

    m_MessageFunctions[DebugLevel](msgBuffer);
    delete[] msgBuffer;
}

在 windows 现在一切正常。

线程 1“ATETests”收到信号 SIGSEGV,分段错误。 __strlen_avx2 () 在 ../sysdeps/x86_64/multiarch/strlen-avx2.S:65 65 ../sysdeps/x86_64/multiarch/strlen-avx2.S: 没有那个文件或目录。

据我所知,这与缓冲区或字符串的大小有关? 你能帮忙吗?

我会用它制作一个可变参数模板,并使用 std::unique_ptr<char[]> 进行内存分配:

#include <memory>

template<class... Args>
void DebugMsg(const char* fmt, Args&&... args)
{
    if (!m_MessageFunctions[DebugLevel]) return;

    int size = std::snprintf(nullptr, 0, fmt, args...) + 1;
    if (size < 1) return; // check for error

    auto msgBuffer = std::make_unique<char[]>(size);

    size = std::snprintf(msgBuffer.get(), size, fmt, args...);
    if (size < 0) return; // probably unnecessary

    m_MessageFunctions[DebugLevel](msgBuffer.get());
}