繁体   English   中英

调试断言失败表达式 __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& 使其成为对stringconst引用可以防止移动语义(据我所知)并且断言不再触发。 我更喜欢此修复程序,因为它将程序保留在现代 C++ 中。

我希望这可以帮助任何有类似问题的人,并注意静态和移动语义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM