问题标签 [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 回答
458 浏览

c++ - std::shared_ptr(新的 DerivedType(...)) != std::make_shared(派生类型(...))?

我还没有发现任何类似的问题:但是如果有人找到了,那就抱歉了。我一直在尝试使用它std::shared_ptr来大大简化内存管理,但是我遇到了一定是某种错误。

当我用它创建一个DerivedType指针时,std::make_shared<type>(DerivedType(...))它只能被寻址为 aType而不是 a DerivedType

然而,当我使用该语法时std::shared_ptr<Type>(new DerivedType),该vfptr表列出了正确的条目,并且可以DerivedType毫无问题地将其转换为 a。

我相信应该没有区别。这是我理解的错误吗?还是一个实际的错误?

谢谢你的帮助。卢克

0 投票
0 回答
509 浏览

c++ - 为什么 make_shared 不适用于可变长度数组?

考虑以下内容:我有一个带有构造函数的类 A,它接受一个大小为 3 的整数数组作为参数。

现在我想为 A 构造一个 shared_ptr。如果我使用

shared_ptr<>(new A (parameter))

一切都很好。

但是如果我尝试使用

make_shared<A>(parameter)

编译器给出错误信息。仅当在堆栈上声明参数数组并使用变量作为数组大小(int 参数 [n])时才会发生这种情况

使用静态数组(int 参数 [3])或使用 new 在堆上分配数组时,问题就消失了。

我的意思是,这不是严重的问题,因为有提到的解决方法。不过,我会很感激任何解释为什么会发生......

顺便说一句,我使用的是 g++ 4.8.2。

这是一个最小的示例和错误日志:

构建日志:

干杯并提前感谢您的回答!

朱里

0 投票
1 回答
213 浏览

multithreading - 人如何将使用 packaged_task 创建的线程(在 boost 中)放入 shared_ptr 向量中

这是来自 boost 库的示例。

而不是boost::thread task(boost::move(pt));在线程上启动任务,
现在我想将线程放入 shared_ptr 向量并在线程上启动任务。

首先我创建一个向量。

这是将线程放入向量的正确方法吗?

谢谢大家的关注!

0 投票
1 回答
203 浏览

boost - 放弃内存的所有权而不通过 shared_ptr 释放它

有没有一种方法可以使共享指针指向不同的内存位置而不释放当前所指向的内存

请考虑代码:

0 投票
1 回答
22 浏览

shared-ptr - 从 shared_ptr 访问引用变量

我不确定标题,所以如果不是很清楚,请提前道歉。

下面的例子说明了我的问题。

当我使用new从成员初始化列表中初始化 shared_ptr 时,当我为 &ref_bar 分配一个值时,一切似乎都工作正常。但是,当我使用首选方式make_shared尝试相同的操作时,它不起作用。

您能否解释一下发生这种情况的幕后情况?

请忽略以下示例中的“坏”编码。我创建了这个来说明我的问题。我对shared_ptr 的重要性感兴趣。

结果是:

这是 ideone 的链接:http: //ideone.com/xluYQ9

0 投票
2 回答
393 浏览

c++ - 用 make_shared 初始化 const 成员

以下代码使用 Xcode 6.3.2 而不是 Visual Studio 2013 编译。

报告的错误是:

这可能是 Visual Studio 中的编译器错误还是代码有问题?

0 投票
1 回答
118 浏览

c++11 - 为什么 std::make_shared(Args&&... args) 要求 T 具有复制构造函数?

我不明白为什么一个类有一个已删除的复制构造函数(或包含一个成员,如 ifstream,它有一个已删除的复制构造函数,并且它也有一个已删除的复制构造函数)不能与 make_shared() 一起使用? 这段代码显示了我在说什么

0 投票
2 回答
2574 浏览

c++ - weak_ptr、make_shared 和内存释放

a 的控制块shared_ptr在至少存在一个时保持活动状态weak_ptr。如果共享指针是用它创建的make_shared,则意味着对象的整个内存都保持分配状态。(对象本身已被适当地破坏,但由于控制块和对象的内存被分配在一个块make_shared中,因此它们只能一起释放。)

我的理解正确吗?

这种行为似乎代表了一个问题,例如在著名的“缓存示例”中。对象的内存将永远分配。

它在任何实际情况下都有问题吗?在这种情况下是否shared_ptr应该使用构造函数创建(大对象和使用 s 的意图weak_ptr)?

0 投票
2 回答
555 浏览

c++ - 尝试执行 shared_ptr swap() 时出现奇怪的错误

我是一个相对的 C++ 新手,试图将现有项目从具有复杂内存管理协议的原始指针转换为使用 C++11 的shared_ptr. 总的来说,进展非常顺利,我我理解shared_ptr移动语义、右值引用等方面的工作原理。好东西。

但是,我遇到了一个我不理解且不知道如何解决的奇怪错误。先说一点背景。我有一个根植于名为 的抽象基类的类层次结构EidosValue,而名为的类EidosValue_Int_vector(间接)是它的具体子类:

我的代码通常会传入EidosValue,但有时,尤其是在创建新值时,我需要处理特定的子类。

我已经shared_ptr为这些类的 s 做了 typedefs,所以我有:

其中。好的,那么现在到问题的核心了。我有一个返回EidosValue_SP它创建的函数。根据函数内的逻辑,它可能会创建EidosValue. 所以我做这样的事情:

问题在于swap()通话。我收到一个错误:“ Non-const lvalue reference to type 'shared_ptr<EidosValue>' cannot bind to a value of unrelated type 'shared_ptr<EidosValue_Int_vector>'”。这令人费解,因为EidosValue_Int_vector它不是“无关类型”,它是 EidosValue 的公共子类,这里的代码知道这一点。如果我键入result = make_shared<EidosValue_Int_vector>();编译器对此没有任何问题,那么它清楚地知道这些类型是相关且兼容的。swap()它只是出于某种原因不喜欢它。在我项目的其他地方,我已经能够简单地做一个return int_result_SP;,声明返回类型为 EidosValue_SP,并且效果很好——编译器很乐意在这种情况下将 EidosValue_Int_vector_SP 视为 EidosValue_SP——但我不能由于函数底部的共享逻辑,请在此处执行此操作。

我在这里的实现中受到了一些限制,因为这段代码是一个瓶颈并且需要快速运行(是的,我从实际检测代码中知道这一点,是的,这确实很重要)。所以使用它make_shared来避免双重分配是很重要的,当我将指针从int_result_SP结果传递到结果时,我也强烈希望避免引用计数递增/递减;我不希望有两个 shared_ptrs 指向新实例的时刻。所以swap()似乎是显而易见的方法;但我被这个编译器错误阻止了。为什么会发生,我该如何解决?谢谢!

附录:

哦,进一步思考这个问题,我敢打赌我知道为什么会发生错误。 swap()不反对将EidosValue_Int_vector放入 中EidosValue_SP,但将放入中确实有问题 在那个方向上,类型不兼容。我没有这样想过,因为它没有任何价值(我猜是有);但当然不知道。好的,所以如果这是问题所在,那么问题仍然存在:如何在保持代码快速的同时实现传输——不执行 refcount inc/dec 并且不离开 using ?既然我理解了这个问题(我认为),似乎可能只是我忽略了一些 API 或技巧......EidosValueEidosValue_Int_vector_SPresultnullptrswap()make_shared

0 投票
0 回答
426 浏览

c++ - std::make_shared 和私有构造函数

我正在为该std::make_shared功能的一个(让我说)极端情况而苦苦挣扎,并且我没有设法找到一个可行的替代方案来解决我的(不那么严重的)问题。

以下代码编译良好:

直观地说,这是一个名为A的用户定义类的工厂的一个小例子。

通过查看 的文档std::make_shared我们发现:

此函数通常用于从调用 new 返回的原始指针替换共享指针的构造 std::shared_ptr(new T(args...))。与该表达式相反,std::make_shared 通常使用单个内存分配为 T 对象和 std::shared_ptr 的控制块分配内存(这是标准中的非绑定要求),其中 std::shared_ptr( new T(args...)) 至少执行两次内存分配。

非常有趣,它可能有助于将注释行与之后的注释行切换。它导致函数的以下代码create

A不幸的是,由于(错误类似于)的私有构造函数,此版本无法编译error: ‘constexpr A::A()’ is private

需要明确的是,问题不是错误本身,对我来说很清楚是什么原因造成的,这是有道理的。无论如何,我想知道是否有一种解决方法可以使用该std::make_shared函数并同时让构造函数成为私有的。据我所知,第一个示例中的代码似乎是唯一可用的解决方案,即使它在术语或性能方面有一个众所周知的(并且记录在案的)缺点也是不言而喻的。