gpt4 book ai didi

c++ - 为什么在所有处理完成后我会收到错误和崩溃代码 0?

转载 作者:行者123 更新时间:2023-11-30 05:39:00 27 4
gpt4 key购买 nike

您好,我有一个使用 boost 的日志记录类,在 initLogging 中我已经这样做了:

// Create a backend
boost::shared_ptr< SinkTextFileBakend > sink = boost::log::add_file_log(
sm_folderOfLogFiles + "optimisations_%Y-%m-%d_%H-%M-%S.%N.log",
boost::log::keywords::format = boost::log::expressions::stream
<< boost::log::expressions::attr< boost::log::attributes::current_process_name::value_type >("Executable") << "("
<< boost::log::expressions::attr< boost::log::attributes::current_process_id::value_type >("ExeUID") << ") CID("
<< correlid << ") " << severity << "["
<< boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
<< "] [" << boost::log::expressions::attr< boost::log::attributes::current_thread_id::value_type >("ThreadID")
<< "] " << classname << " - " << boost::log::expressions::smessage,
boost::log::keywords::open_mode = (std::ios::out | std::ios::app),
boost::log::keywords::rotation_size = 2 * 1024 * 1024,
boost::log::keywords::auto_flush = true
);

sink->locked_backend()->set_open_handler(&openingHandler);

boost::log::core::get()->set_filter(severity >= SeverityLevels::info);
boost::log::core::get()->add_sink(sink);

// for logging in console, too
boost::shared_ptr< boost::log::sinks::text_ostream_backend > backend =
boost::make_shared< boost::log::sinks::text_ostream_backend >();
backend->add_stream(
boost::shared_ptr< std::ostream >(&std::cout));

// Enable auto-flushing after each log record written
backend->auto_flush(true);

// Wrap it into the frontend and register in the core.
// The backend requires synchronization in the frontend.
boost::shared_ptr< boost::log::sinks::synchronous_sink< boost::log::sinks::text_ostream_backend > > backend_sink(
new boost::log::sinks::synchronous_sink< boost::log::sinks::text_ostream_backend >(backend)); // for testing and printing log in sysout

backend_sink->set_formatter(
boost::log::expressions::stream
// line id will be written in hex, 8-digits, zero-filled
<< boost::log::expressions::attr< boost::log::attributes::current_process_name::value_type >("Executable")
<< "(" << boost::log::expressions::attr< boost::log::attributes::current_process_name::value_type >("ExeUID")
<< ") CID(" << correlid << ") " << severity << " ["
<< boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
<< "] [" << boost::log::expressions::attr< boost::log::attributes::current_thread_id::value_type >("ThreadID")
<< "] " << classname << " - " << boost::log::expressions::smessage);
boost::log::core::get()->add_sink(backend_sink); // for testing and printing log in sysout

所以我有 2 个后端,一个用于在文件中写入,另一个用于在控制台中打印。在执行结束时,我得到这样的错误:

*** Error in `/home/sop/project/build/proj': double free or corruption (out): 0x00000000008caaa0 ***
*** Crashed with return code: 0 ***

(在 IDE 中:KDevelop)或:

*** Error in `./proj': double free or corruption (out): 0x00000000008caaa0 ***
Aborted (core dumped)

(如果在终端中运行)

我已经做了一些测试,如果我删除了登录到控制台的部分,那么这个问题就会消失。如果它只有控制台日志记录的部分,我似乎得到了同样的错误,所以似乎所有的问题都在那个部分。我不明白我做错了什么,请提供任何帮助。谢谢

最佳答案

这一行有问题:

backend->add_stream(
boost::shared_ptr< std::ostream >(&std::cout));

std::cout 是一个全局对象,不能用 operator delete 删除,这发生在 boost::shared_ptr 被销毁时。您应该使用 boost::null_deleter:

backend->add_stream(
boost::shared_ptr< std::ostream >(&std::cout, boost::null_deleter()));

关于c++ - 为什么在所有处理完成后我会收到错误和崩溃代码 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525966/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com