草庐IT

c++ - std::allocate_shared,允许从自定义分配器和单次分配中分配共享指针引用计数

Makeshared使用引用计数和对象的单一分配提高性能,是否可以将自定义分配器与std::allocate_shared一起使用并且仍然有一个分配,根据我写的测试代码它没有发生:sample我知道boost::intrusive,但它有额外的代码需要编写并且可能出错 最佳答案 在一些调试的帮助下发现std::allocate_shared做了预期的事情,它允许你只为你的对象和引用计数器进行一次分配。下面是更正后的代码:allocateshared此处operatornew对std::make_shared和std::allocat

c++ - 处理数组时 make_unique 和 make_shared 之间的区别

从C++17开始,您可以使用make_unique为了创建指向数组的智能指针,例如:unique_ptrptr=make_unique(10);这将创建一个指向10个元素数组的智能指针(将调用适当的deleter[]的事实也很棒)。但是根据thismake_shared不支持此类功能(至少在C++17中不支持,据我所知):shared_ptrptr=make_shared(10);上面的代码显然是非法的。事实上,我的VisualStudio2017(v141)吐出以下错误:C2070:'int[]':illegalsizeofoperand'有趣的是shared_ptr本身确实支持数组

c++ - Boost Asio - 使用 shared_ptr 处理解析器和套接字

我有一个类能够通过TCP发送消息。这里是简化的界面:classCommandScreenshot:publicCameraCommand{public:CommandScreenshot();~CommandScreenshot();voidDispatch(boost::shared_ptrio_service);private:voidresolve_handler(constboost::system::error_code&err,boost::asio::ip::tcp::resolver::iteratorendpoint_iterator);};如您所见,我有一个函数Di

c++ - 作为模板参数的函数的多态签名(使用 lambda)

我努力尝试了几个小时,但没能成功。我有一个模板类自旋锁:templateclassspinlock{//...volatileT*shared_memory;};我正在尝试创建这样的东西://insidespinlockclasstemplatestd::result_of(F(Args...))exec(Ffun,Args&&...args){//locksthememoryandthenexecutesfun(args...)};但我正在尝试使用多态函数,这样我就可以做到这一点:spinlockspin;inta=spin.exec([](){return10;});intb=sp

c++ - union 中的 std::shared_ptr

我正在实现一个“变体”类,它必须具有尽可能小的内存占用并使用共享指针机制存储一些对象。为此,我想在所有变量类型的类中建立一个union。这包括一些shared_ptr。operator=和复制构造函数必须更改变量的数据类型,从而切换到union中的另一个成员。切换到shared_ptr后,应将其重置为null而无需删除/取消拥有指针。有办法做到这一点吗?当然,还有其他方法可以实现这一点,但在我的例子中,它们通常更复杂、更不安全或消耗更多内存。不过欢迎提出任何建议。谢谢! 最佳答案 重置为null是不够的;的实现std::shared

c++ - 类似于嵌套互斥体但更通用的东西?

我正在处理一个项目,在对类的成员对象执行某些操作后必须保存一个文件。有时我们希望在一次操作后保存文件,有时我们需要在执行了一批操作之后才保存它。我的想法是使用一个基本上像递归互斥锁一样工作的类。除了不锁定和解锁互斥锁,我希望类在堆栈中类的最后一个实例超出范围时调用一个方法(在本例中为保存文件)。实现一个执行此操作的类不是问题,但这感觉像是我在Boost或STL中找不到的一般问题。这个问题是否有预先存在的标准解决方案,或者我需要推出自己的类(class)来解决这个问题?如果是这样,我的方法是否正确,或者是否有更好的方法来解决问题?下面是我正在寻找的那种行为的简单实现。它只会打印“Hell

c++ - 在多个容器中存储对象的最佳实践

我想将对象存储在priority_queue和unordered_map中。做这样的事情有最佳实践吗?我考虑过将对象存储在一个单独的容器中(比如array),然后放弃指向其他两个容器的指针。虽然我很犹豫是否要这样做,因为那意味着我必须编写一些额外的比较器来处理容器将存储指针而不是实际对象的事实。此外,还有一些额外的工作来管理我不想处理的对象的所有权。所以,我想知道是否还没有确定的最佳方法来做到这一点? 最佳答案 您已经看到,如果您希望1个事物出现在2个地方,则必须存储对对象的(某种)引用。虽然您曾经会使用指针,但今天我们有share

c++ - 为什么 C++14 中没有 shared_mutex 或 recursive_shared mutex?

在C++11中,您有mutex、timed_mutex和recursive_mutex。C++14添加了shared_timed_mutex。为什么没有shared_mutex或shared_recursive_mutex是有原因的? 最佳答案 它是在N3995:Aproposaltoaddshared_mutex(untimed)(Revision2)中提出的引用:AttheIssaquahISOC++meetingof2014shared_mutexwasrenamedtoshared_timed_mutexperproposa

c++ - 如何为 friend 函数中定义的类授予友元?

这个问题是不言自明的,但如果需要的话,这里有一个例子:假设我有一个带有私有(private)构造函数的类“Thing”,它是一个函数“make_thing”的friend:classThing{friendstd::shared_ptrmake_thing();Thing(){std::cout“make_thing”函数内部定义了一个结构:std::shared_ptrmake_thing(){//err:Thing::Thing()isprivatewithinmake_shared//autothing=std::make_shared();//thisisokaystructA

c++ - 当只剩下一个引用时删除由 shared_ptr 管理的对象

我有std::map>,它的作用类似于ResourceDatabase。项入std::map当有人请求不在std::map中的资源时插入(否则将从std::map提供服务)。同样,当Resource不再使用时,应该将其删除。在ResourceDeleter,我将从std::map中删除记录.问题是ResourceDeleter永远不会被调用,因为还有一个std::shared_ptr在std::map.当项目插入std::map时,总会有2std::shared_ptr-一个用于需要资源的代码,一个在std::map中.当第一个std::shared_ptr已删除,我需要从std::m