问题标签 [smart-pointers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 中 clone() 的最佳签名是什么?
正如 Scott Myers 所写,您可以利用 C++ 类型系统中的放松来声明 clone() 以返回指向正在声明的实际类型的指针:
编译器检测到 clone() 返回一个指向对象类型的指针,并允许 Derived 覆盖它以返回一个指向derived 的指针。
最好让 clone() 返回一个暗示所有权语义转移的智能指针,如下所示:
不幸的是,约定的放宽不适用于模板化智能指针,并且编译器将不允许覆盖。
所以,看来我有两个选择:
- 让 clone() 返回一个“哑”指针,并记录客户负责处理它的文件。
- 让 clone() 返回一个智能基指针,并让客户端在需要时使用 dynamic_cast 将它们保存到派生指针。
这些方法之一是首选吗?或者有没有办法让我吃掉我的所有权语义转移并拥有我强大的类型安全性?
c++ - .访问冲突读取位置
我遇到了一个非常奇怪的问题。
代码如下:
我收到以下异常:
我已经检查了pImage
,我确定什么时候graphics.DrawImage
被调用,它不是NULL
。
- 为什么会出现这样的问题?
- 是什么
0xfeeefef2
?
c++ - 在 VC++ 8 中替换 auto_ptr
std::auto_ptr
在 VC++ 8 中被破坏(这是我们在工作中使用的)。我对它的主要抱怨是它允许auto_ptr<T> x = new T();
,这当然会导致可怕的崩溃,同时很容易出错。
从stackoverflow上另一个问题的答案:
请注意,Visual Studio 2005 中 std::auto_ptr 的实现被严重破坏。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
我想用
boost::scoped_ptr
, 对于不应传递所有权的指针。boost::shared_ptr
, 用于容器中和需要它们的其他地方的指针。std::auto_ptr
, 对于应该/可以传递所有权的指针。
但是因为std::auto_ptr
对我来说已经坏了,我想知道最好的方法是什么:
- 换成
std::auto_ptr
网上的东西。就像Rani Sharoni 的这个(还没试过)。 - 改为使用
boost::shared_ptr
。当然会起作用,尽管会有一些我不关心的小开销。但我想用auto_ptr
指针的意图来表示。(有关此方法的投票,请参阅此答案。) - 在实践中我永远不需要传递所有权,所以我不应该担心这个。
更新:这是我所做的:我复制了 Rani Sharoni 的上述 auto_ptr 实现。从这里。
做了一些小测试:
当然,这些测试绝不是详尽无遗的,您不应该相信它们。实现一个异常安全的模板类是一件棘手的事情。至少这比内置的效果更好。
注意:关于版权,我不知道我是否被允许使用这个实现。我已经给 Rani 发了电子邮件,正在等待回复。当我知道更多时,我会更新这篇文章。
每个人都可以根据需要使用 Rani Sharoni 的 auto_ptr 实现。
感谢您的所有回复。
c++ - C++ 智能指针性能
与裸指针相比,使用智能指针,尤其是 boost::shared_ptr 在时间和内存方面的成本更高?对游戏/嵌入式系统的性能密集型部分使用裸指针是否更好?您会建议对性能密集型组件使用裸指针还是智能指针?
c++ - BSTR 和 _bstr_t 有什么区别?
任何人都可以解释上述类型之间的区别和一些示例用法以清楚地解释两者之间的区别吗?
任何帮助将不胜感激!注意:这个问题是从另一个问题衍生而来的
c++ - 一旦你采用了 boost 的智能指针,有没有使用原始指针的情况?
我很好奇,因为我开始采用更多的 boost 习语以及似乎是最佳实践的最佳实践'还没有被介绍给“现代 C++”?
c++ - 智能指针+“this”被认为是有害的?
在使用智能指针的 C++ 项目中,例如boost::shared_ptr
,关于使用“ this
”的良好设计理念是什么?
考虑一下:
存储包含在任何智能指针中以供以后使用的原始指针是很危险的。您已经放弃了对对象删除的控制,并相信智能指针会在正确的时间执行此操作。
非静态类成员本质上使用
this
指针。这是一个原始指针,无法更改。
如果我曾经存储this
在另一个变量中或将其传递给另一个函数,该函数可能会存储它以供以后使用,或者将其绑定到回调中,那么当任何人决定创建指向我的类的共享指针时,我就会创建错误。
鉴于此,我什么时候适合显式使用this
指针? 是否有可以防止与此相关的错误的设计范例?
c++ - 适用于 Windows Mobile 6 SDK 的智能指针
我无法为我的 WinMobile 项目获取 std::tr1::shared_ptr,因为 WinCE 的 STL 由 Microsoft 的另一个团队维护:( aarrgh ...
有人使用过另一个线程安全的引用计数智能指针吗?我实际上正在使用看起来不错的 yasper。
非常感谢你。
c++ - 带有用 C 编写的库的智能指针
我将 C++ 与 OpenCV 库一起使用,这是一个库图像处理,尽管这与这个问题无关。目前我有一个设计决定要做。
OpenCV 是一个 C 库,其数据结构(例如 CvMat)被声明为结构。要创建它们,可以使用 cvCreateMat 之类的函数,要释放它们,请使用 cvReleaseMat 之类的函数。作为一名 C++ 程序员,我创建了一个特殊的cv_scoped
类,当它超出范围时会自动调用 cvReleaseMat(如boost::scoped_ptr
)。
我现在意识到的是,我希望我也可以使用auto_ptr
and shared_ptr
in case 。我只是觉得为自己cv_auto_ptr
和cv_shared_ptr
班级编写代码是个坏主意,更不用说浪费时间了。所以我一直在寻找解决方案,我提出了三种可能性。
首先,我可以使用我已经创建的 cv_scoped 类。我将它重命名为cv_ptr
然后使用智能指针,如下所示std::auto_ptr<cv_ptr>
:不过,令人讨厌的是,我总是不得不取消引用两次:
我知道看起来我可以声明一个隐式转换,但实际上我不能——大多数 OpenCV 的函数都有参数 void*——所以不会调用隐式转换。我真的很想这样做,我不必做双重取消引用。
其次,我可以以某种方式覆盖operator delete
。我不想覆盖全局运算符 delete,因为我只希望它适用于 CvMat(和其他一些)类型。但是,我无法更改库,因此无法添加operator delete
到 CvMat 结构中。所以我不知道这将如何工作。
第三,我可以重写我自己的auto_ptr
,scoped_ptr
和shared_ptr
. 他们不是大班,所以不会太难,但我只是觉得这是糟糕的设计。如果我要这样做,我可能会按照以下方式做一些事情:
在我的情况下你会怎么做?请帮我解决这个问题。