草庐IT

unique-constraint

全部标签

c++ - mutex.lock 与 unique_lock

什么时候我应该更喜欢第一段代码而不是第二段,它们是否有根本区别std::mutexmtx;mtx.lock();...//protectedstuffmtx.unlock();...//non-protectedstuffmtx.lock();...//etc和std::mutexmtx;std::unique_locklck(mtx);...//protectedstufflck.unlock();...//non-protectedstufflck.lock();...//etc我知道lock_guard基本上是一个没有锁定和解锁功能的unique_lock,但我很难区分互斥锁和使

c++ - 如何在 C++ 中使用/创建 unique_lock?

请问,谁能解释如何在C++中使用和创建一个unique_lock?它既应该用于对监视器的任何过程进行互斥,也应该用于对条件变量执行wait()......我从文档中不明白我应该如何创建它。是否需要互斥锁?这是一个伪代码:/*compilewithg++,flags-std=c++0x-lpthread*/#include#include#include#include#include#includeclassmonitorTh{private:std::mutexm;std::condition_variablewaitP;std::condition_variablewaitC;ch

c++ - std::unique_ptr 的推荐用法

这个问题在这里已经有了答案:WhatisasmartpointerandwhenshouldIuseone?(14个回答)WhichkindofpointerdoIusewhen?(4个回答)关闭9年前。std::unique_ptr的推荐用途是什么?我发现:Aboutunique_ptrperformances我已经知道了:std::unique_ptr是在C++11中开发的,作为std::auto_ptr的替代品std::unique_ptr没有引用计数并且“拥有”它指向的对象没有std::unique_ptr的复制/分配当我需要一个唯一指针时,std::unique_ptr是转到

c++ - 为什么 std::unique_ptr::reset() 总是无异常?

Arecentquestion(尤其是我的回答)让我想知道:在C++11(和更新的标准)中,析构函数总是隐式的noexcept,除非另有说明(即noexcept(false))。在这种情况下,这些析构函数可以合法地抛出异常。(请注意,这仍然是一种你应该真正知道自己在做什么——那种情况!)然而,所有的重载std::unique_ptr::reset()被声明为始终为noexcept(见cppreference),即使析构函数ifT不是,如果析构函数在reset()期间抛出异常,将导致程序终止.类似情况适用于std::shared_ptr::reset().为什么是reset()总是noe

c++ - 为什么 std::unique_ptr operator* 会抛出而 operator-> 不会抛出?

在C++标准草案(N3485)中,它声明如下:20.7.1.2.4unique_ptr观察者[unique.ptr.single.observers]typenameadd_lvalue_reference::typeoperator*()const;1Requires:get()!=nullptr.2Returns:*get().pointeroperator->()constnoexcept;3Requires:get()!=nullptr.4Returns:get().5Note:usetypicallyrequiresthatTbeacompletetype.你可以看到oper

c++ - std::unique_ptr 用法

std::unique_ptrp1(newint);std::unique_ptrp2(newint);p2=p1;这里似乎p1不再是“唯一的”,因为p2也引用了它这是合法的c++吗?unique_ptr有copy_semantics吗?如果不是,并且它只有移动语义,那么在将p1分配给p2之后是否将其设置为NULL?编辑:好的,所以正确的版本是p2=std::move(p1)据此,在此分配之后,p1无效?和auto_ptr的区别就在这里?明确指定所有权的转移比隐含的更安全,因为我猜想auto_ptr就是这种情况 最佳答案 std::

c++ - 将 unique_ptr 传递给函数

我正在尝试“现代化”一些现有代码。我有一个类,它当前有一个成员变量“Device*device_”。它在一些初始化代码中使用new创建实例,并在析构中有一个“deletedevice_”。该类的成员函数调用许多以Device*作为参数的其他函数。这很好用,但为了“现代化”我的代码,我认为我应该将变量更改为"std::unique_ptrdevice_"并删除对删除的显式调用,这使代码更安全,通常更好。我的问题是这个-我应该如何将device_变量传递给所有需要它作为参数的函数?我可以调用.get来获取每个函数调用中的原始指针。但这看起来很丑陋,并且浪费了一些首先使用unique_ptr

c++ - 为什么不能从 unique_ptr 构造weak_ptr?

如果我理解正确,weak_ptr不会增加托管对象的引用计数,因此它不代表所有权。它只是让您访问一个对象,该对象的生命周期由其他人管理。所以我真的不明白为什么不能从unique_ptr构造weak_ptr,而只能从shared_ptr构造。有人能简单解释一下吗? 最佳答案 如果您考虑一下,weak_ptr必须引用对象本身以外的其他内容。这是因为对象可以不复存在(当没有更多的强指针指向它时)并且weak_ptr仍然必须引用包含对象不再存在的信息的东西。使用shared_ptr,该东西就是包含引用计数的东西。但是对于unique_ptr,

c++ - 错误 : ‘unique_ptr’ is not a member of ‘std’

我想这是不言自明的-我似乎无法使用C++11功能,即使我认为我已经正确设置了所有内容-这可能意味着我没有。这是我的代码:#include#includeclassObject{private:intvalue;public:Object(intval){value=val;}intget_val(){returnvalue;}voidset_val(intval){value=val;}};intmain(){Object*obj=newObject(3);std::unique_ptrsmart_obj(newObject(5));std::coutget_val()这是我的g++版

c++ - unique_ptr 的动态转换

与Boost中的情况一样,C++11提供了一些用于转换shared_ptr的函数:std::static_pointer_caststd::dynamic_pointer_caststd::const_pointer_cast然而,我想知道为什么没有unique_ptr的等效函数。考虑以下简单示例:classA{virtual~A();...}classB:publicA{...}unique_ptrpA(newB(...));unique_ptrqA=std::move(pA);//Thisislegalsincethereisnocastingunique_ptrpB=std::m