我已经转换了我的旧代码:
#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);
}变成动态分配的字符*
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;
}窗户上现在一切都很好。
线程1 "ATETests“接收信号SIGSEGV,分割故障。__strlen_avx2 ()在../sysdeps/x86_64/multiarch-avx2.S: 65 ./sysdeps/x86_64/multiarch-strlen-avx2.S:没有这样的文件或目录。
据我所见,这与缓冲区或字符串的大小有关吗?你能帮上忙吗?
发布于 2022-05-03 19:27:23
我会用它做一个不同的模板,然后使用一个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());
}https://stackoverflow.com/questions/72104337
复制相似问题