这个问题在这里已经有了答案:Whyisn'tthereastd::shared_ptrspecialisation?(1个回答)关闭7年前。我想知道std::shared_ptr没有为数组定义[]运算符这一事实背后的基本原理是什么。特别是为什么std::unique_ptr具有此运算符而不是std::shared_ptr?
我正在考虑在我的Windows应用程序中处理更长的文件路径。目前,我有一个文本框(编辑框),用户可以在其中键入绝对文件路径。然后,我使用GetWindowText将键入的文件路径读入声明如下的字符串:TCHARFilePath[MAX_PATH];显然,这里我依赖于MAX_PATH常量,它将我限制为260个字符。因此,为了处理更长的文件/路径名称,我可以像这样扩展我的TCHAR数组:TCHARFilePath[32767];。或者有更好的方法吗?我可以使用可变长度数组吗?(TCHARFilePath[];这在C++中是否可行?-抱歉,我对此很陌生)。先谢谢你!这是我上面提到的整个代码片
我不知道如何让scoped_ptr或scoped_array使用自定义删除器。也许还有另一种实现类似于shared_ptr允许受控删除?顺便说一句,为什么shared_ptr允许自定义删除器而scoped_ptr不允许?只是好奇。 最佳答案 Idon'tseehowtogetscoped_ptrorscoped_arraytousecustomdeleter你不能。Maybethereisanotherimplementationwhichallowscontrolleddeletionsimilartoshared_ptr?如果您
我有一个resource_manager维护std::vector>的类在内部。resource_manager是resource的好友类.我要resources只能由resource_manager创建/删除,所以我将其构造函数设为私有(private)(可以正常工作)。但是,如果我将析构函数设为私有(private),则代码不会编译,因为析构函数由boost::shared_ptr调用,这不是resource的friend.我正在考虑通过只返回constresource*来强制执行“不要被客户删除”规则来自resource_manager,但不知何故我对这种方法提供的安全性不满意(
我想通过对函数的智能指针引用传递一个对象。该函数可能会更改引用对象的值,但可能不会更改引用本身。有两种明显的方法可以解决这个问题。按值传递shared_ptr的第一种方法-它是引用,因此它本身不需要按引用传递。这样做的明显问题是引用的复制,这表明存在一些引用计数开销。voidfoo(shared_ptrp)第二种方法是通过const引用传递shared_ptr-避免复制shared_ptr实例,而是暗示对引用对象的访问需要两层解引用而不是一层。voidfoo(constshared_ptr&p)在实践中,这些理论开销通常微不足道且无关紧要。这对我来说表明,我应该几乎总是遵循一些标准惯例
我有一个结构来管理从基类派生的对象Entity,但不控制它们的生命周期。我希望这个结构被赋予像weak_ptr这样的弱指针这样它就可以知道该对象是否已在其他地方被销毁。但是,在共享指针所在的管理结构之外,我希望共享指针更具体shared_ptr(SpecificEntity使用Entity作为基类)。有没有什么办法可以做到这一点,或者类似的东西? 最佳答案 很有可能。您可以随时转换shared_ptr到shared_ptr隐含地,对于另一个方向你有std::static_pointer_cast和std::dynamic_point
std::unique_ptr指定存储不是T*如您所料,但是类型为std::unique_ptr::pointer的对象.这基本上定义为D::pointer如果存在这样的类型,并且T*否则。因此,您可以通过适本地自定义删除器来自定义底层原始指针类型。什么时候这样做是个好主意?它是干什么用的?我能找到的唯一讨论是thisnote,这暗示“更好地支持[ing]共享内存上下文中的容器和智能指针”,但这并没有完全说明很多问题。 最佳答案 最初的动机是启用boost::offset_ptr的使用作为unique_ptr下的表示,这将允许在进程
如果我需要多态性,我应该使用原始指针而不是unique_ptr吗?我看到一些线程显示如何使用unique_ptr进行多态行为。我不确定这是否值得,我宁愿使用原始指针。您能否对此发表评论,您对这种情况下原始指针与智能指针的看法? 最佳答案 下面的简单代码表明std::unique_ptr从多态性的角度来看工作得很好,打印"HellofromDerived."。#include#includeusingstd::cout;structBase{virtual~Base(){}virtualvoidSayHello(){coutpBase
std::shared_ptr保证是线程安全的。我不知道典型的实现使用什么机制来确保这一点,但它肯定有一些开销。即使您的应用程序是单线程的,这种开销也会存在。是上述情况吗?如果是这样,如果您没有使用线程安全保证,这是否意味着它违反了“您不为未使用的东西付费”的原则? 最佳答案 如果我们检查cppreferencestd::shared_ptr的页面他们在实现说明部分陈述了以下内容:Tosatisfythreadsafetyrequirements,thereferencecountersaretypicallyincremented
我有一个简单的类结构来模拟离散模拟,它有一个状态vector,每个状态包含许多转换,作为智能指针vector保存。我使用智能指针来保存转换,因为在我的完整应用程序中我需要多态性。#include#includeclassTransition{public:Transition(){}};classState{public:State(intnum):num(num),transitions(){}voidadd_transition(std::unique_ptrtrans){transitions.push_back(std::move(trans));}private:intnum