草庐IT

c++ - shared_ptr, unique_ptr, ownership,在这种特殊情况下我是不是做得太过分了?

我在图形应用程序上工作,并且一直在使用共享指针和唯一指针,主要是因为它为我处理内存重新分配(又名方便),这可能很糟糕(如果这就是我使用它们的原因)。我最近在Stackoverflow上阅读了一个问题的答案,其中提到根据B.Stroustrup的说法,通常不应使用唯一/共享指针,而应改为按值传递参数。我有一个图形方面的案例,我认为使用shared_ptr是有意义的,但我想从专家那里知道(我不是C++专家)我是否在做/想它,如果是的话他们会做什么(为了符合C++推荐和效率)我将以渲染/光线追踪中出现的一般问题为例。在这个特定的问题中,我们有一个对象池(我们将使用三角形来进行解释)和一个结构

c++ - 将 vector<shared_pt<T>> 复制到 vector<shared_ptr<const T>> (不同情况)C++

我有一个:std::vector>我想复制到一个std::vector>现在我注意到如果我这样做:classA{public:A(conststd::vector>&list):internalList(list.begin(),list.end()){}std::vector>internalList;};它编译得很好(clang++std==c++14)但是如果我这样做:classA{public:A(conststd::vector>&list):internalList(list){}std::vector>internalList;};我觉得奇怪的是,当我使用复制构造函数时它

c++ - 使用 weak_ptr 实现观察者模式

我目前拥有的是:观察者.hclassObserver{public:~Observer();virtualvoidNotify()=0;protected:Observer();};classObservable{public:~Observable();voidSubscribe(std::shared_ptrobserver);voidUnsubscribe(std::shared_ptrobserver);voidNotify();protected:Observable();private:std::vector>observers;};观察者.cppvoidObservabl

c++ - 安全地将(shared_ptr 的 vector 到对象)转换为(shared_ptr 的 vector 到常量对象)

classA{};typedefshared_ptrAConstPtr;typedefshared_ptrAPtr;vectorptr;constvector*foo(){return&ptr;}此代码无法编译,因为“没有从vectorAptr>*到constvectorAConstPtr>*的隐式转换”有没有办法在不创建新vector且不使用不安全强制转换的情况下完成这项工作?我需要这个的原因是因为我有一个类在内部将列表存储为vectorAPtr>,但需要通过其接口(interface)公开它的一个完全const版本。 最佳答案

c++ - 为什么通过 weak_ptr 调用这么慢?

我已阅读问题What'stheperformancepenaltyofweak_ptr?但我自己的测试显示不同的结果。我正在使用智能指针创建委托(delegate)。下面的简单代码显示重现了weak_ptr的性能问题。谁能告诉我为什么?#include#include#include#include#include#include#includestructFoo{Foo():counter(0){incrStep=1;}voidbar(){counter+=incrStep;}virtual~Foo(){std::cout&g){constautost=std::chrono::hi

c++ - 如何使用 shared_ptr 并从 enable_shared_from_this 继承来制作克隆方法

我已经看到编写返回boost::shared_ptr的克隆方法的一种有用方法是做classA{public:shared_ptrClone()const{return(shared_ptr(CloneImpl()));}protected:virtualA*CloneImpl()const{return(newA(*this));}};classB:publicA{public:shared_ptrClone()const{return(shared_ptr(CloneImpl()));}protected:virtualB*CloneImpl()const{return(newB(*

c++ - RAII、unique_ptr 和输出参数

我是一名尝试学习C++11的C#开发人员。我正在尝试使用windns.h查询DNS。我从DnsQuery()开始,读到我需要使用DnsRecordListFree()释放结果记录输出参数。C#方法可能是使用try-finallyblock来确保我无论如何都释放资源。但我了解到没有finallyblock,并且windns.h确实应该与时俱进并实现RAII兼容接口(interface)(据我了解典型的建议)。我没有等待它发生,而是尝试制作一个RAII包装器类,其析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针。但我对如何正确使用此句柄或指针来获取输出参

c++ - 为什么没有 boost::copy_on_write_ptr?

我刚看到this不错的写时复制指针实现。它看起来非常通用和有用,所以我的问题是:这样的类是否包含在任何C++工具包(boost、loki等)中?如果不是,我真的很想知道为什么,因为它是一个非常有用的习惯用法,而且显然通用实现似乎是可行的(就像我链接到的那个)。 最佳答案 关于这种可能性存在很多争论,并且至少有一个建议版本最终以auto_ptr形式出现,用于引用计数的COW指针。不幸的是,COW的时代已经过去了。使COW指针(或COW-whatever)线程安全会引入严重的问题performanceproblems.编辑:重读,我觉得

c++ - 具有 unique_ptr 的用户友好型 API

我正在为OpenGL实现一个简单的GUI,主要是作为我自己的练习。这个想法是有一个Gui类,其中每个实例都可以分配给不同的渲染目标(例如后台缓冲区或纹理)。GUI元素(小部件)恰好分配给Gui类的一个实例。我想在GUI中存储元素是unique_ptr的典型用例.这是我想出的:classElement{public:Element();virtual~Element();staticstd::unique_ptrcreate_unique();};classGui{public:typedefstd::unique_ptrelement_ptr;Gui();voidaddElement(

c++ std::unique_ptr 不会在 map 中编译

我目前正在尝试将std::unique_ptr存储在std::unordered_map中,但出现奇怪的编译错误。相关代码:#pragmaonce#include"Entity.h"#include#includeclassEntityManager{private:typedefstd::unique_ptrEntityPtr;typedefstd::mapEntityMap;EntityMapmap;public:/*AddsanEntity*/voidaddEntity(EntityPtr);/*RemovesanEntitybyitsID*/voidremoveEntity(i