![](/img/trans.png)
[英]Debug Assertion Failed! Expression: __acrt_first_block == header
[英]Debug Assertion Failed Expression __acrt_first_block == header
我一直在试图弄清楚为什么会发生这种情况,也许这只是由于目前缺乏经验,但真的可以使用一些帮助。
当我运行使用 C++20 编译成 DLL 的代码时,我发现调试断言失败,表达式为 __acrt_first_block == header。
我缩小了代码失败的范围,但奇怪的是,当我将 Init(std::string filePath function 签名更改为不包含参数时,它运行得很好。代码如下,希望有人能提供帮助。
记录器.h
#pragma once
#include "../Core.h"
#include <memory>
#include <string>
#include "spdlog/spdlog.h"
namespace Ruby
{
class RUBY_API Logger
{
public:
static void Init(std::string filePath);
inline static std::shared_ptr<spdlog::logger>& GetCoreLogger() { return coreLogger; }
inline static std::shared_ptr<spdlog::logger>& GetClientLogger() { return clientLogger; }
private:
static std::shared_ptr<spdlog::logger> coreLogger;
static std::shared_ptr<spdlog::logger> clientLogger;
};
}
记录器.cpp
namespace Ruby
{
std::shared_ptr<spdlog::logger> Logger::coreLogger;
std::shared_ptr<spdlog::logger> Logger::clientLogger;
void Logger::Init(std::string filePath)
{
std::string pattern{ "%^[%r][%n][%l]: %v%$" };
auto fileSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(filePath, true);
// Setup the console and file sinks
std::vector<spdlog::sink_ptr> coreSinks;
coreSinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
coreSinks.push_back(fileSink);
// Bind the sinks to the core logger.
coreLogger = std::make_shared<spdlog::logger>("RUBY", begin(coreSinks), end(coreSinks));
// Set the Patterns for the sinks
coreLogger->sinks()[0]->set_pattern(pattern);
coreLogger->sinks()[1]->set_pattern(pattern);
// Tell spdlog to flush the file loggers on trace or worse message (can be changed if necessary).
coreLogger->flush_on(spdlog::level::trace);
// Set the default level of the logger
coreLogger->set_level(spdlog::level::trace);
// Do the same for the client logger
std::vector<spdlog::sink_ptr> clientSinks;
clientSinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
clientSinks.push_back(fileSink);
clientLogger = std::make_shared<spdlog::logger>("APP", begin(clientSinks), end(clientSinks));
clientLogger->sinks()[0]->set_pattern(pattern);
clientLogger->sinks()[1]->set_pattern(pattern);
clientLogger->flush_on(spdlog::level::trace);
clientLogger->set_level(spdlog::level::trace);
}
}
入口点.h
#pragma once
#ifdef RB_PLATFORM_WINDOWS
extern Ruby::Application* Ruby::CreateApplication();
int main(int argc, char** argv)
{
Ruby::Logger::Init("../Logs/Recent_Run.txt");
RB_CORE_INFO("Initialized the logger.");
auto app = Ruby::CreateApplication();
app->Run();
delete app;
return 0;
}
#else
#error Ruby only supports windows
#endif // RB_PLATFORM_WINDOWS
对于遇到类似问题的其他人,这是我解决它的方法。
本质上, Init()
function 的 function 签名是问题所在。 std::string
参数导致调试断言触发,我现在最好的猜测是因为移动语义,但我仍然不确定那部分。 所以我发现有几种方法可以解决这个问题。
方法一:
将参数设为const char*
。 我不太喜欢这种方法,因为它依赖于 C 样式的字符串,如果您尝试用现代 C++ 编写程序,这是一个巨大的倒退。
方法二:
使参数成为const std::string&
。 使其成为对string
的const
引用可以防止移动语义(据我所知)并且断言不再触发。 我更喜欢此修复程序,因为它将程序保留在现代 C++ 中。
我希望这可以帮助任何有类似问题的人,并注意静态和移动语义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.