- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在此insightful article ,其中一位 Qt 程序员试图解释 Qt 实现的不同种类的智能指针。一开始,他区分了共享数据和共享指针本身:
First, let’s get one thing straight: there’s a difference between sharing pointers and sharing data. When you share pointers, the value of the pointer and its lifetime is protected by the smart pointer class. In other words, the pointer is the invariant. However, the object that the pointer is pointing to is completely outside its control. We don’t know if the object is copiable or not, if it’s assignable or not.
Now, sharing of data involves the smart pointer class knowing something about the data being shared. In fact, the whole point is that the data is being shared and we don’t care how. The fact that pointers are being used to share the data is irrelevant at this point. For example, you don’t really care how Qt tool classes are implicitly shared, do you? What matters to you is that they are shared (thus reducing memory consumption) and that they work as if they weren’t.
坦率地说,我只是不理解这个解释。文章评论中有澄清请求,但我认为作者的解释不够。
如果您确实理解这一点,请解释。这种区别是什么,其他共享指针类(即来自 boost 或新的 C++ 标准)如何适应这种分类法?
提前致谢
最佳答案
在后来的评论中,他澄清了一点
This is the important point I tried to get through in the first section. When you use QSharedPointer, you’re sharing the ownership of the pointer. The class controls and handles the pointer only — anything else (like access to the data) is outside its scope. When you use QSharedDataPointer, you’re sharing the data. And that class is intended for implicit sharing: so it may split up.
试图解释:
需要注意的是,这里的“指针”并不是指存储地址的对象,而是指对象所在的存储位置(地址本身)。所以严格来说,我认为,你必须说你正在分享地址。 boost::shared_ptr
因此是共享“指针”的智能指针。 boost::intrusive_ptr
或另一个侵入式智能指针似乎也共享该指针,尽管对所指向的对象有所了解(它具有引用计数成员或递增/递减它的函数)。
例子:如果有人和你分享一个黑盒子,而他不知道黑盒子里面是什么,这类似于分享指针(代表盒子),而不是数据(盒子里面是什么) ).事实上,你甚至不知道盒子里面的东西是可以共享的(如果盒子里什么都没有怎么办?)。智能指针由您和其他人代表(当然,您不共享),但地址是盒子,它是共享的。
共享数据意味着智能指针充分了解指向的数据,它可能会更改指向的地址(这需要复制数据等)。因此,指针现在可能指向不同的地址。由于地址不同,地址不再共享。这就是std::string
也在一些实现上做:
std::string a("foo"), b(a);
// a and b may point to the same storage by now.
std::cout << (void*)a.c_str(), (void*)b.c_str();
// but now, since you could modify data, they will
// be different
std::cout << (void*)&a[0], (void*)&b[0];
共享数据并不一定意味着您有指针呈现给您。您可以使用 std::string
通过纯粹的方式 a[0]
和 cout << a;
永远不要触摸任何 c_str()
功能。仍然可以在幕后进行共享。许多 Qt 类和其他小部件工具包的类也会发生同样的事情,这称为隐式共享(或写时复制)。所以我认为可以这样总结:
所以尝试归类
boost::shared_ptr
, boost::intrusive_ptr
:共享指针,而不是数据。 QString
, QPen
, QSharedDataPointer
:共享其中包含的数据。 std::unique_ptr
, std::auto_ptr
(还有 QScopedPointer
):既不共享指针,也不共享数据。 关于C++ 智能指针 : sharing pointers vs. 共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657762/
是否可以有DropShadowEffect渲染阴影时忽略某些颜色?有某种蒙版(颜色选择性)阴影? 我的问题是什么阴影可以分配给整个视觉元素(图形)。它看起来像这样: 而且我要 注意没有阴影的网格线(除
It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, over
有时,当我尝试使用 maven mvn clean install jetty:run 运行我的项目时,它会返回一个错误消息:“地址已在使用中”。 我正在使用 Intellij IDEA 14。 你能
我见过几个数据库缓存引擎,它们都非常愚蠢(即:将此查询缓存 X 分钟)并要求您在 之后手动删除整个缓存存储库>INSERT/UPDATE/DELETE 查询已执行。 大约 2 或 3 年前,我为我正在
我正在寻找例程或寻找错误容忍字符串比较的方法。 比方说,我们有测试字符串 Čakánka - 是的,它包含 CE 字符。 现在,我想接受以下任何字符串作为 OK: 恰坎卡 cákanká ÇaKaNK
大家好 我在 windows xp 系统上使用智能 gwt 2.3 专业版和 Mozilla。 我在上面做了测试应用程序,它运行成功。 现在我想为此应用程序使用开发人员控制台。 我的gwt.xml 编
说,我有 member this.Test (x: 'a) = printfn "generic" 1 member this.Test (x:
我正在努力寻找有关如何将应用程序部署到索尼智能 watch 的任何文档或教程(我正在尝试部署由索尼编写的开源“Eight Puzzle”应用程序,我已将其导入到 Eclipse 中。我有一个三星 S3
我正在寻找一个类似于标准格式化程序的智能 Java 字符串格式化程序: StringBuffer buffer = new StringBuffer(); Formatter form
我有一个智能 JScrollPane,但与其他所有解决方案不同,我想知道如果滚动 Pane 不在底部并且文本是否可以跟随(向上滚动)查看的组件(JTextArea)缓冲区已满。包含功能齐全的代码片段。
我有一个包含 18 个类(class)的项目。它们正在工作线程保存(已检查),没有递归调用,也没有任何复杂的计算。 但是我的IDEA总是说几个小时后 There is not enough memor
我想使用 Smart XLS 库在 C# 中处理 excel 文件(特别是因为它可以生成图表,而且它的价格明显低于 Aspose Cells),但我找不到任何好的例子。我只想知道如何创建和修改图表,有
我正在寻找一个完整的 java 日期管理库,它可以让我理解像这样的字符串: 明天中午 => 2011-10-20 12:00 今天下午 4 点 => 2011-10-20 16:00 等... 但如果
我想打开手机中的文件,通过 watch 中的 Action ... 问题是: Intent intent2 = new Intent(); intent2.setAction(android.cont
我想编译 Sony 为他的 SmartWatch 提供的示例。我按照此 page 中的说明进行操作.但是当我添加 SmartExtensionUtils 项目时,我看到了很多错误,例如:com.son
我有一个 SQL 表:名称、位置、体积 名称为字符串类型 位置是两个 float 类型的字段(纬度和经度) int 类型的体积 我想运行一个 SQL 查询,该查询将对特定范围内的所有位置进行分组并对所
我需要找到当我点击某物时调用的方法。项目很大,自己找会花不少时间。有什么办法可以做到吗?我正在使用 Android Studio,是的,这是我有史以来第一次使用其他人的项目。 最佳答案 我是怎么做到的
我在我的 iMac 上安装了智能 cvs,我已经从 cvs 更新了应用程序。然后我对我的代码和核心数据做了一些更改(核心数据更改是:从核心数据实体中删除一些属性),然后我尝试将更改提交给 cvs,但我
在我的 Java 项目中,我有一个类 Person,它存在于两个具有相同包名 (com.example.beans) 的不同 jar 中。 问题是这个类在jar1中是这样定义的: class Pers
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我是一名优秀的程序员,十分优秀!