草庐IT

c++ - 调用 join 后删除 std::thread?

我有一些代码可以动态分配一个新的std::thread来自C++11标题,像这样:std::thread*th=newthread(/*myargs*/);一段时间后,我调用加入:th->join();既然我动态分配了线程,我还需要调用deleteth;吗?释放内存?如果我这样做,我还需要打电话吗join()第一? 最佳答案 为避免内存泄漏,您需要:加入一个正在运行的线程,并确保它已被破坏/删除(让它超出堆栈分配的范围std::threads或为std::thread*显式调用delete。参见thread::~thread在cpp

c++ - 为什么我可以从 {} 初始化一个常规数组,而不是一个 std::array

这个有效:intarr[10]={};arr的所有元素都值初始化为零。为什么这行不通:std::arrayarr({});我从g++(版本4.8.2)收到以下警告:warning:missinginitializerformember‘std::array::_M_elems’ 最佳答案 有两个问题,一个是样式问题,另一个是警告。虽然可能并不明显,但聚合初始化发生在一个临时对象上,然后将其用作复制构造函数的参数。执行此初始化的更惯用的方式如下:std::arrayarr={};虽然这样还是留下了警告。警告由gccbugreport:

C++11:使用 std::move 只对临时对象安全吗?

在我的代码中,我有这样的东西:unordered_multimap>mEntities;...vector>rawEntities;if(qi::phrase_parse(&buf[0],(&buf[0])+buf.size(),EntityParser(),qi::space,rawEntities)){for(auto&propGroup:rawEntities){autosearch=propGroup.find("classname");if(search!=propGroup.end()){//isstealingpropGroupsafe???mEntities.empla

C++14 - std::revers(ed) std::string 是否在开头包含空字符?

如果我在std::string变量上使用std::reverse,我可以安全地假设空字符'\0'会放在字符串的开头吗? 最佳答案 不,它不会包含NUL字节(除非你在那里放一个)。前向迭代器也不包含NUL字节,它只会迭代字符串本身中的字符。但是,NUL字节保证在.c_str()或.data()的末尾之后。示例程序:#include#include#includeintmain(){std::strings="Hello";std::cout(*i)(*i)输出:Forwards:H72e101l108l108o111Backwards

c++ - 在 std::variant 中按类型获取索引

标准库中是否有实用程序可以获取std::variant中给定类型的索引?还是我应该自己做一个?即我要获取B的索引在std::variant并获得返回1.有std::variant_alternative为相反的操作。当然,std::variant上可能有很多相同的类型的列表,所以这个操作不是双射,但对我来说不是问题(我可以在列表中第一次出现类型,或者在std::variant列表中出现唯一类型)。 最佳答案 几年后更新:我在这里的回答可能很酷,但是this是正确的。这就是我今天要解决这个问题的方法。我们可以利用index()几乎已经

c++ - 对范围项使用 std::set 容器

我想在std::set中存储一堆范围项容器。此数据结构应通过重载std::set的比较来快速判断特定输入范围是否包含在该集合当前包含的范围之一中。为了使用set::find检查集合中的一项是否包含输入范围参数的方法。它还应该支持表示单个点的范围项(start_range==end_range)。这是我的实现:#include#include#includeusingstd::set;usingstd::map;classrange:publicstd::pair{public:range(intlower,intupper){if(upper下面是我测试数据结构的方式:intmain(

c++ - std::promise 和 std::future 的非明显生命周期问题

这个问题与这里的前一个问题非常相似:race-conditioninpthread_once()?本质上是同一个问题——std::promise的生命周期在调用promise::set_value期间结束(即:在关联的future被已标记,但在pthread_once执行之前)所以我知道我的用法有这个问题,因此我不能以这种方式使用它。但是,我认为这并不明显。(用ScottMeyer的名言:让界面易于正确使用而难以错误使用)下面我举个例子:我有一个线程(dispatcher),它在队列上旋转,弹出一个“作业”(一个std::function)并执行它。我有一个名为synchronous_

c++ - 为什么要在 C++11 中添加 std::isblank?

我注意到添加了std::isblank(在中)和std::isblank(在中)在C++11中。我找到了这个page上面写着Returnstrueifcisablankcharacter;thatis,aspaceoratab.(对于“C”语言环境),因此空白字符可能是空白字符的子集,但是我不明白区分的原因,因为我们有std::isspace.为什么是std::isblank添加到标准库?更新根据here,看起来POSIX规范首先引入了“空白”字符类,然后C和C++标准也跟进了。 最佳答案 possiblyablankcharact

c++ - 为什么 `std::copy` 在我的测试程序中从 char 缓冲区读取一个 int 比 `memcpy` 慢 5 倍(!)?

这是thisquestion的后续行动我在哪里发布了这个程序:#include#include#include#include#include#include#include#include#includeclassStopwatch{public:typedefstd::chrono::high_resolution_clockClock;//!ConstructorstartsthestopwatchStopwatch():mStart(Clock::now()){}//!Returnselapsednumberofsecondsindecimalform.doubleelapse

c++ - std::move 和 unique_ptr::reset 之间有什么区别?

对于std::unique_ptr的p1和p2,std::move()有什么区别>和std::unique_ptr::reset()?p1=std::move(p2);p1.reset(p2.release()); 最佳答案 根据[unique.ptr.single.assign]/2中移动分配的标准规范,答案应该是显而易见的:Effects:Transfersownershipfromuto*thisasifbycallingreset(u.release())followedbyanassignmentfromstd::forw