问题标签 [make-shared]

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.

0 投票
2 回答
222 浏览

c++ - 在什么意义上,weak_ptr“拥有”一个 shared_ptr?

我试图为这个问题写一个标题大约 10 分钟,你会看到我最终失败了。[编者注:我想我已经解决了这个问题。]

我正在阅读Herb Sutter 的博客,主题是使用 std::make_shared 及其优缺点。请看附上的照片:

在此处输入图像描述

这是一篇非常有趣的文章的一小部分,我强烈建议人们阅读。我的问题是关于这句话:

一个“弱引用”计数,用于跟踪当前观察对象的weak_ptrs 数量。当最后一个弱引用消失时,共享内务控制块被销毁和释放(如果共享对象尚未释放,则共享对象被释放)。**

我真的不明白这个说法。std::shared_ptr最初,当我们通过make_sharedeg创建 a 时,当前没有观察 sp1 的弱 ptrs,因此当以通常的方式超出范围auto sp1 = make_shared<widget>();时,它将被删除。shared_ptr

那么添加弱引用如何改变这种行为呢?谁能给我解释一下?

0 投票
1 回答
218 浏览

c++ - C++接口的工厂函数实现

语境化:

我正在研究一种面部识别算法,而 NIST 是试图标准化所有可用算法之间的测试、测量和比较的组织。为了进行测试和比较,我需要实现它们的接口,该接口在 FRVT Project中可用,更具体地说是在frvt11.h文件中。

frvt11.h这个问题的相关代码:

implementation.h我正在开发的实现的相关代码:

implementation.cpp我正在开发的实现的相关代码:

最后我的问题:

问题:如何实现 getImplementation() 以返回引用的“指向接口对象的托管指针”?

0 投票
1 回答
2913 浏览

c++ - make_unique 和 make_shared 处理数组时的区别

从 C++17 开始,您可以使用make_unique它来创建指向数组的智能指针,例如:

这将创建一个指向 10 个元素的数组的智能指针(正确的 deleter[] 将被调用的事实也很棒)。

但是据此 make_shared支持此类功能(据我了解,至少在 C++17 中不支持):

上面的代码显然是非法的。事实上,我的 Visual Studio 2017 (v141) 吐出以下错误:

有趣的是它shared_ptr本身确实支持数组类型(即合法),但shared_ptr<int[]>不支持。而确实如此。make_sharedmake_unique

问题是,是什么阻止了标准制定者让make_shared支持数组类型,就像make_unique?

0 投票
1 回答
128 浏览

c++ - GCC 8 无法编译 make_shared()

这段代码可以干净地编译,并且可以与我尝试过的所有编译器一起使用,除了 GCC 8(和当前的 GCC 主干):

我想知道:

  1. GCC 8 拒绝此代码是否正确?
  2. 是否有 GCC 8 将接受的替代品(具有相同的语义和性能)?我知道std::atomic,但语义不一样,所以建议使用它而不是volatile我想要的。

在这里看到它:https ://godbolt.org/z/rKy3od

0 投票
1 回答
417 浏览

c++11 - C++ 中的 make_shared() 引用计数

出自:C++ 之旅(第二版)

13.2.1 unique_ptr 和 shared_ptr

使用make_shared()不仅比使用 new 单独创建对象然后将其传递给 shared_ptr 更方便,而且它也明显更有效,因为它不需要单独分配使用计数,这在实现shared_ptr

我的问题:为什么shared_ptr需要为引用计数分配内存而make_shared()不需要?(它是否只会在至少有两个对数据的引用时才分配它?)

编辑:我没有注意到文本中的“单独”这个词,所以我的问题是无关紧要的,Tough - 我仍然想问为什么 make_shared() 更有效

0 投票
1 回答
169 浏览

c++11 - 如何使用 make_shared 创建相同类型的对象数组?

与使用“new”相比,我们可以使用“make_shared”更快、更安全地创建对象。例如,

如果我需要创建一个对象数组(例如 Dog[3]),是否可以使用“make_shared”而不是“new”?此外,是否可以通过 make_shared 方法使用自定义删除功能?

0 投票
1 回答
6204 浏览

c++11 - 调用“make_shared”没有匹配的函数

每当我尝试使用带有任何参数的构造函数时,我都会收到编译器错误“没有匹配的函数来调用'make_shared'”。因此,例如:

工作正常。但,

给出以下错误:

我直接从这里获取了上面的代码http://www.cplusplus.com/reference/memory/make_shared/ 并且该代码在 cpp.sh 网站上运行良好。我怀疑我的编译器设置有问题。在 Macbook 上的 iTerm 中运行。此外,即使我删除了上面显示的各种 clang 选项,我也会遇到同样的错误。有任何想法吗?我的头文件是否可能需要更新?它是从 2015 年 9 月 4 日开始的。似乎最近足以让 C++11 工作。

0 投票
0 回答
87 浏览

c++ - shared_ptr C++ 可能存在内存泄漏

我正在尝试调试由我的代码中的以下行引起的可能的内存泄漏:

我认为一个可能的原因是使用 shared_ptr 而不是更有效的 make_shared。如果是这样,我如何在上述情况下使用 make_shared ?我检查了几篇提到无法使用 make_shared 编写的自定义删除器的帖子。谁能指导我处理这个内存泄漏?

提前致谢。

0 投票
0 回答
161 浏览

c++ - shared_ptrs 从函数返回后会自行销毁

我有一个 shared_ptr 向量,但在从函数调用返回后它被销毁,但只有在从填充函数返回并且元素是第一个和第二个 [0],[1] 之后。

我不明白为什么,当我在填充函数中时,我正在检查引用计数,它是 2,在调用之前它是 1,我还没有离开函数 scoop

0 投票
1 回答
321 浏览

c++ - 将复制构造函数与 std::make_shared 结合使用

我定义了一个Integer包含int值的简单类,调用std::make_shared<Integer>(&ref)将强制程序使用接受int. 我是否实现了错误的复制构造函数,或者我的使用有问题std::make_shared?打电话有什么区别std::make_shared<Integer>(ref)?另外,为什么不Integer copied_integer(integer);使用复制构造函数?Integer copied_integer(&integer);也是不允许的。

这是代码