c++ 相关问题

C ++是一种通用编程语言。它最初被设计为C的扩展,并保持类似的语法,但现在是一种完全不同的语言。使用此标记来查询有关使用C ++编译器编译的代码的问题。对特定标准版本[C ++ 11],[C ++ 17]等相关问题使用版本特定标记。

如何正确退出使用Boost Log的程序?

下面的示例程序工作正常,但 valgrind 显示,退出后仍然可以访问 6 个块中的 520 字节。 #包括 #包括 #包括 下面的示例程序工作正常,但是 valgrind 显示,退出后仍然可以访问 6 个块中的 520 字节。 #include <iostream> #include <string> #include <boost/log/common.hpp> #include <boost/log/sources/logger.hpp> #include <boost/log/utility/setup/file.hpp> #include <boost/phoenix/bind/bind_member_function.hpp> #include <boost/shared_ptr.hpp> namespace bl = boost::log; namespace bp = boost::phoenix; enum class MySeverityLevel { panic, alert, critical, error, warning, notice, info, debug }; BOOST_LOG_ATTRIBUTE_KEYWORD(Severity, "Severity", MySeverityLevel) BOOST_LOG_ATTRIBUTE_KEYWORD(Channel, "Channel", std::string) class Logger { public: Logger(const std::string& CH, const MySeverityLevel SEV): m_log(bl::keywords::channel = CH), m_channel(CH), m_severityMax(SEV) { m_sink = bl::add_file_log ( bl::keywords::file_name = CH + ".log", bl::keywords::filter = bp::bind(&Logger::filter, this, Channel.or_none(), Severity.or_none()) ); } ~Logger() { this->terminate(); } void terminate() { if (m_sink) { bl::core::get()->remove_sink(m_sink); m_sink->flush(); m_sink.reset(); } } void panic(const std::string& S) { BOOST_LOG_SEV(m_log, MySeverityLevel::panic) << S; } void debug(const std::string& S) { BOOST_LOG_SEV(m_log, MySeverityLevel::debug) << S; } private: using ChannelValue = bl::value_ref<std::string, tag::Channel>; using MySeverityLevelValue = bl::value_ref<MySeverityLevel, tag::Severity>; bool filter(const ChannelValue& CH, const MySeverityLevelValue& SEV) const { if (CH && SEV) { return (CH.get() == m_channel) && (SEV.get() <= m_severityMax); } else { return false; } } bl::sources::severity_channel_logger<MySeverityLevel, std::string> m_log; boost::shared_ptr<bl::sinks::sink> m_sink; const std::string m_channel; const MySeverityLevel m_severityMax; }; int main() { Logger lgA("A", MySeverityLevel::error); lgA.panic("A: Panic"); lgA.debug("A: Debug"); lgA.terminate(); } 这就是 valgrind 输出: hekto@ubuntu:~$ valgrind --leak-check=full --show-leak-kinds=all ./tc0013 ==48934== Memcheck, a memory error detector ==48934== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==48934== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info ==48934== Command: ./tc0013 ==48934== ==48934== ==48934== HEAP SUMMARY: ==48934== in use at exit: 520 bytes in 6 blocks ==48934== total heap usage: 83 allocs, 77 frees, 97,276 bytes allocated ==48934== ==48934== 8 bytes in 1 blocks are still reachable in loss record 1 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x4E98C61: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 8 bytes in 1 blocks are still reachable in loss record 2 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x4E9EF69: boost::log::v2_mt_posix::aux::this_thread::get_id() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x4E8BB96: boost::log::v2_mt_posix::core::open_record(boost::log::v2_mt_posix::attribute_set const&) (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x118DEA: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:259) ==48934== by 0x11825B: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::open_record_with_channel_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&, boost::parameter::void_) (channel_feature.hpp:195) ==48934== by 0x1172B2: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (channel_feature.hpp:171) ==48934== by 0x115E8B: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:253) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 16 bytes in 1 blocks are still reachable in loss record 3 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x512A5BA: boost::detail::add_thread_exit_function(boost::detail::thread_exit_function_base*) (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x4E98C9A: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 24 bytes in 1 blocks are still reachable in loss record 4 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x4E98C84: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 24 bytes in 1 blocks are still reachable in loss record 5 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x512A1BC: boost::detail::make_external_thread_data() (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x512A5AD: boost::detail::add_thread_exit_function(boost::detail::thread_exit_function_base*) (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x4E98C9A: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== 440 bytes in 1 blocks are still reachable in loss record 6 of 6 ==48934== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==48934== by 0x512A03D: boost::detail::make_external_thread_data() (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x512A5AD: boost::detail::add_thread_exit_function(boost::detail::thread_exit_function_base*) (in /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1) ==48934== by 0x4E98C9A: boost::log::v2_mt_posix::sources::aux::get_severity_level() (in /usr/lib/x86_64-linux-gnu/libboost_log.so.1.65.1) ==48934== by 0x11723B: boost::log::v2_mt_posix::sources::aux::severity_level<MySeverityLevel>::set_value(MySeverityLevel) (severity_feature.hpp:135) ==48934== by 0x115E74: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_severity_logger<boost::log::v2_mt_posix::sources::basic_channel_logger<boost::log::v2_mt_posix::sources::basic_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, MySeverityLevel>::open_record_unlocked<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (severity_feature.hpp:252) ==48934== by 0x114961: boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char, boost::log::v2_mt_posix::sources::severity_channel_logger<MySeverityLevel, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2_mt_posix::sources::single_thread_model, boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<MySeverityLevel>, boost::log::v2_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::open_record<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> >(boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity, MySeverityLevel const> const&) (basic_logger.hpp:575) ==48934== by 0x1135A5: Logger::panic(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (tc0013.cpp:81) ==48934== by 0x11097B: main (tc0013.cpp:120) ==48934== ==48934== LEAK SUMMARY: ==48934== definitely lost: 0 bytes in 0 blocks ==48934== indirectly lost: 0 bytes in 0 blocks ==48934== possibly lost: 0 bytes in 0 blocks ==48934== still reachable: 520 bytes in 6 blocks ==48934== suppressed: 0 bytes in 0 blocks ==48934== ==48934== For counts of detected and suppressed errors, rerun with: -v ==48934== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 在我的实际应用程序中,Logger类位于库中,这就是为什么我需要正确终止它(终止由systemctl执行)。但是,在退出应用程序期间,我仍然在 syslog 中看到异常: terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::log::v2_mt_posix::system_error> >' 我认为找到一种方法在退出后摆脱这些“6个块中的520字节”将帮助我清楚地终止我的应用程序。 如何正确编写 terminate 函数(见上文) - 以便 不 使 Boost Log 内部的任何内容都可访问? 操作系统:Ubuntu 18.04.1 LTS 编译器:g++ 7.3.0 提升:1.65.1 Valgrind:3.13.0 tl;dr; boost.log 注定要失败,使用其他东西...... 这些调用堆栈中的特殊细节是重复调用boost::detail::add_thread_exit_function,它是boost::this_thread::at_thread_exit的实现,显然用于在线程即将结束时执行一些清理操作。然而,此函数不能与系统特定的线程结束 API 和函数(例如 exit)一起使用。如文档中所述: 特别是,从main()返回相当于调用exit(),因此不会调用任何用at_thread_exit()注册的函数 因此 boost.log 在从主线程调用时不会执行任何清理。此外,(除了其他丑陋的事情之外)boost.log 使用 Meyer 的单例来保存核心上下文的实例,因此库用户无法控制核心上下文(及其拥有的对象)的生命周期,并且容易出现静态[un]初始化顺序惨败。

回答 1 投票 0

`(expession, lvalue) = rvalue` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器接受/拒绝它?

不久前,我偶然发现了 C 构造(例如 (expr0, expr1, expr2))如何计算的想法(有关更多上下文,请参阅“逗号运算符 , 的作用是什么?”)。我已经开始尝试了

回答 1 投票 0

c++ 手动串联 C 字符串函数,调用两次并添加一个空格

我有一个作业要编写一个函数,该函数采用两个 C 字符串参数并将第二个参数附加到第一个参数,就像 strcat 函数一样,但不使用所述函数。然后,写一个主要的驱动...

回答 1 投票 0

我可以避免显式指定编译器标志以获得良好优化的构建吗?

假设我有一个 CMake 项目,它生成一个 CPU 密集型应用程序。 当我构建用于二进制分发或性能基准测试的二进制文件时,我希望它们最大,或者至少...

回答 2 投票 0

非静态数据成员按什么顺序初始化?

在下面的代码中,当调用X的ctor时,会先调用A还是B的ctor?它们在类主体中的放置顺序是否控制这一点?如果有人可以提供

回答 3 投票 0

如何自动实例化模板函数

我有一些模板函数,只有一个模板参数。 // 添加.cpp 模板 T 添加(T a, T b) { // 做某事 } // 函数1.cpp 模板 void func1(在...

回答 1 投票 0

我可以避免显式指定编译器标志以获得良好优化的构建吗?

假设我有一个 CMake 项目,它生成一个 CPU 密集型应用程序。 当我构建用于二进制分发或性能基准测试的二进制文件时,我希望它们最大,或者至少...

回答 1 投票 0

shared_ptr 如何使用 -> 和 .具有相同变量名的运算符?

我在下面的示例中遇到了困惑,我声明了一个共享 ptr 'u' 我正在使用 u->data 以及 u.use_count() 既然 'u' 持有一个指针,那么我们如何使用点运算符来调用 use_coun...

回答 1 投票 0

在windows、nix和macos上弹出错误消息框的最简单方法?

我正在编写一个相当小的跨平台程序,它使用 OpenGL 进行显示,使用 GLFW 进行跨平台窗口创建。 我想在

回答 3 投票 0

为什么这些功能的表现如此不同?

我制作了两个用于将向量相加的函数,以便我可以将正弦波相加,其中一个使用 + 运算符相加,另一个使用 lambda 函数将它们相加,这使得它很容易...

回答 1 投票 0

为什么这些函数的表现如此不同?

我制作了两个用于将向量相加的函数,以便我可以将正弦波相加,其中一个使用 + 运算符相加,另一个使用 lambda 函数将它们相加,这使得它很容易...

回答 1 投票 0

使用深色模式 GUI 时更改 QwtPlot 背景?

当我禁用通过 BreezeStyleSheet 提供的深色模式时: https://github.com/Alexhuszagh/BreezeStyleSheets 它有效(我可以使用设置画布调色板将背景更改为我想要的任何内容,然后

回答 1 投票 0

作品中没有名为“oeuvre”的成员

类作品{ 私人的: 字符串滴定度; 作者&作者; 弦语言; [...] }; 示例类{ 私人的: 作品&作品; 公众:...

回答 1 投票 0

C++:Oeuvre 中没有名为“oeuvre”的成员

类作品{ 私人的: 字符串滴定度; 作者&作者; 弦语言; }; 示例类{ 私人的: 作品&作品; 民众:

回答 1 投票 0

clang-format 可以消除 include 语句尖括号内的空格吗?

考虑这个 include 语句。 注意 iostream 之后的额外空格: #包括 msvc 会编译它,但 gcc 不会。 因此,我们的 Windows 开发人员可能不会看到此故障,直到您...

回答 1 投票 0

opencv/modules/core/src/matrix_wrap.cpp:72:错误:(-215:断言失败)0<= i && i < (int)vv.size() in function 'getMat_'

你能帮我解决这个错误吗? a 和 b 是 2-double 数组,由行和列定义。 a 是给定矩阵: cv::调整大小(a,b,cv::Size(newrows,newcols),0,0,INTER_CUBIC); 我可以编译,但是......

回答 1 投票 0

如何设置 CMake 项目以使用本地库?

想象一下以下设置: 您有许多个人库和应用程序:libA、libB、libC、appA、appB,它们具有如下依赖关系树: 应用程序A - > {libA} libC -> {libA} appB -> {libB, l...

回答 1 投票 0

以带有保护措施的字符串流形式解析数字数据?

我目前正在尝试实现一个函数,以便解析来自 Arduino 电路板的数字数据(来自通过 USB 连接连接到我的 PC 的电位计的浮子),但是...

回答 1 投票 0

for 循环的简写 - C++ 中的语法糖(11)

其实这是两个相关的问题。 我知道 C++11 中有一种用于基于范围的 for 循环的新语法,其形式为: //v是一些容器 对于(自动&i:v){ // 用 i 做一些事情 } 第一

回答 8 投票 0

std::string 的 strlen(str.c_str()) 和 str.length() 之间的区别

作为一种隐含的理解,我一直认为 std::string 的每个实现都必须满足每个字符串 str 的 strlen(str.c_str()) == str.length() 。 C++ 标准是什么...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.