草庐IT

gray8_ptr_t

全部标签

c++ - 在多线程环境中使用 auto_ptr 交换对象而不锁定是安全的吗?

我在堆上分配了一些数据结构,它们很少被修改但需要快速读取访问。一个例子是在堆上分配的结构,许多线程以只读方式非常频繁地访问它。需要定期重写此结构并避免锁定争用我想知道使用auto_ptr是否安全基本上允许已获取引用的线程继续处理直到它们完成writer创建结构的拷贝,重写它并快速与结构的新auto_ptr实例交换指针。我从Java中的CopyOnWriteArrayList得到这个想法,并希望在C++中执行类似的性能。 最佳答案 std::auto_ptr在调用非常量成员(例如reset())时没有任何线程安全保证正如你所建议的。此

c++ - 处理容器中的 unique_ptr

我有一个指向模型、网格等的unique_ptrvector,如下所示:std::vector>mLoadedModels;我选择unique_ptr是因为它会在vector析构函数时自动释放数据,还因为稍后如果我需要重新加载所有模型(由于OpenGL上下文拆除/创建)我可以在我的资源管理器内部重置()并使其指向一个新的模型实例,它不会影响系统的其余部分。但我的问题是,您将如何与其他系统共享vector的内容?您不能只传递unique_ptr,因为那会改变所有权(由于它的unique_ptr),我希望在资源管理器中拥有唯一所有权。我想出的解决方案如下,将访问包装在以下结构中:templa

c++ - 无法从 std::shared_ptr <_Ty> 转换参数 1 (??)

在完成我的游戏原型(prototype)时,我遇到了这个错误,我以前从未见过。我试图将两个.cpp文件链接在一起,这个:#include#include"mage.h"#include"Warrior.h"#include"Rogue.h"#include"CharacterType.h"#include#include#include"Inventory.h"#include"blankEnemy.h"#include"Enemy.h"#include"Boss.h"#include#include#include"DeathMenu.h"#include"GameStart.h"#

c++ - 如何对数组使用 unique_ptr

我有课classA{public:A(){couta(newA[5]);//-doesn'tworkunique_ptra(newA[1]);//-doesn'tworkunique_ptra(newA);//-works}为什么会这样?我猜是关于移动构造函数的(由于析构函数,它不能自动创建),但是为什么我们在这里需要一个移动构造函数?和之间有什么区别:unique_ptra(newA[1]);//-doesn'tworkunique_ptra(newA);//-works 最佳答案 要将unique_ptr与数组分配一起使用,您需

c++ shared_ptr 从 char* 到 void*

我正在尝试将char*字符串传递给将在线程内执行的函数。该函数具有以下原型(prototype):voidf(void*ptr);线程分配由类似于以下的函数进行:voidappend_task(std::function&f,void*data);我想分配一个将在线程内部使用的字符串。现在我有这个:stringname="randomstring";char*str=newchar[name.length()];strcpy(str,name.c_str());append_task(f,static_cast(str));我想放弃手动分配和解除分配内存的义务。我如何使用std::sh

c++ - 可以将右值移动到 shared_ptr 中吗

是否可以将一个右值“移动”到一个shared_ptr中。到目前为止,我尝试过的所有方法都会产生一个拷贝。我想要的使用模式是:classElement{public:Element(conststring&);Element(constElement&)=delete;//deletecopyconstructor//...};classMyCollectionOfElements{public:voidadd(Element&&);//addbyrvalue//...protected:vector>elements;};MyCollectionOfElementselements;e

c++ - 引用计数在 shared_ptr 中不起作用

以下代码会导致运行时错误。每个shared_ptr拥有相同的内存,但每个的计数仍然是一。因此,每个共享指针都是不同的,所以当它们超出范围时,它们会尝试释放block,这会导致堆损坏。我的问题是如何避免这种情况?只想添加这样的声明shared_ptrx(p);不可协商,我必须声明。#include#includeusingnamespacestd;intmain(){int*p=newint(10);shared_ptra(p);shared_ptrb(p);shared_ptrc(p);shared_ptrd(p);cout 最佳答案

c++ - 我可以将函数的输出参数存储到 unique_ptr 中吗?

我有以下代码:classThing{};voidfnc(Thing**out){*out=newThing();};其中fnc通过输出参数返回Thing的新实例。通常我会按如下方式使用它:intmain(){Thing*thing;fnc(&thing);}我可以将返回的对象放在std::unique_ptr中吗?intmain(){std::unique_ptruniqueThing;fnc(???);} 最佳答案 要扩展您的代码示例,它(即传递指针)将是voidfnc(std::unique_ptr*out){out->rese

c++ - 如何用空指针初始化 unique_ptr 的 vector ?

我需要初始化一个vector>与nullptr秒。this中的方法帖子太复杂了。我的情况比较特殊,只需要初始化为nullptr.我怎样才能实现它?我知道我可以使用for循环来push_back一个nullptr每一次。有什么优雅的方法吗?顺便说一句,make_unqiue不适用于我的编译器。#include#include#includeusingnamespacestd;structTNode{//charch;boolisWord;vector>children;TNode():isWord(false),children(26,nullptr){}};intmain(){TNod

c++ - 为什么 shared_ptr 有显式构造函数

我想知道为什么shared_ptr没有隐式构造函数。这里提到了它没有的事实:Gettingaboost::shared_ptrforthis(我想出了原因,但认为无论如何发帖都会是一个有趣的问题。)#include#includeusingnamespaceboost;usingnamespacestd;voidfun(shared_ptrptr){cout'requested*/ 最佳答案 在这种情况下,shared_ptr将尝试释放您分配给堆栈的int。你不会想要那样的,所以显式构造函数会让你考虑一下。