信号 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());
}
我已经转换了我的旧代码:
#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());
}