问题标签 [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 投票
1 回答
756 浏览

c++ - make_shared() 的可调试替换

使用 gcc 4.6.2,如果构造函数抛出异常, make_shared() 会给出无用的回溯(显然是由于一些重新抛出)。我正在使用 make_shared() 来节省一些输入,但这是显示停止器。我创建了一个允许正常回溯的替代make_shrd() 。我正在使用 gdb 7.3.1。

我担心的是:

  1. make_shared() 下的不良回溯不知何故是我自己的错
  2. 我的替代品 make_shrd() 会给我带来一些微妙的问题。

这是一个演示:

编译:

调试:

make_shared() 回溯是垃圾,不会显示堆栈到异常点。所有其他选项都提供了合理的回溯。

提前感谢您的帮助和建议。

0 投票
4 回答
39757 浏览

c++ - make_shared 真的比 new 更高效吗?

我正在使用C++11 进行试验,并编写了一个小玩具示例,以查看shared_ptr调用. 作为基础架构,我使用 llvm/clang 3.0 以及 XCode4 中的 llvm std c++ 库。make_sharedmake_shared

现在看看输出,请:

使用 make_shared 创建 smart_ptr...

构造函数 make_shared

复制构造函数...

复制构造函数...

析构函数

析构函数

使用 make_shared 创建 smart_ptr:完成。

使用新创建 smart_ptr...

构造函数新

使用 new: done 创建 smart_ptr。

析构函数

析构函数

似乎make_shared调用了复制构造函数两次。如果我为Object使用常规分配内存,则new不会发生这种情况,只会Object构造一个。

我想知道的是以下内容。我听说这make_shared应该比使用new( 1 , 2 )更有效。一个原因是因为make_shared将引用计数与要管理的对象一起分配在同一块内存中。好的,我明白了。这当然比两个单独的分配操作更有效。

相反,我不明白为什么这必须伴随着两次调用Object. 因此,我不相信在每种make_shared情况下都比使用分配更有效。我在这里错了吗?好吧,可以实现一个移动构造函数,但我仍然不确定这是否比仅通过分配更有效。至少不是在所有情况下。如果复制比为引用计数器分配内存更便宜,那将是正确的。但是-internal 引用计数器可以使用几个原始数据类型来实现,对吧?newObjectObjectnewObjectshared_ptr

尽管概述了复制开销,您能否帮助并解释为什么make_shared在效率方面要走的路?

0 投票
3 回答
1743 浏览

c++ - boost::make_shared 没有调用(放置)运算符 new?

我第一次使用 boost::make_shared 创建共享指针指向的对象。主要是因为我们的代码太慢了,单次分配确实有助于提高性能。

在“硬手动方式”修复了一些内存泄漏之后,我决定通过覆盖所有相关类的新运算符来实现一个简单的内存泄漏检测器,只是为了计算哪些对象在我们的应用程序的特定点仍然存在。我之前已经实现过几次,并且惊讶地发现我的代码不再检测到任何对象。

我认为我所要做的就是覆盖“placement new”而不是“normal” operator new,因为 make_shared 的 boost 网站文档中的以下内容:

“效果:分配适合 T 类型对象的内存,并通过放置 new 表达式 new( pv ) T() 或 new( pv ) T( std::forward(args)...) 在其中构造一个对象。 allocate_shared使用 a 的副本分配内存。如果抛出异常,则无效。”

然而,我的新位置也没有被调用。我编写了一个小测试程序来重现该行为:

呈现以下输出:

我期待在输出的第 3 行出现“测试非投掷新位置”。你认为行为应该是什么?您是否同意根据 make_shared 的文档,它应该调用我的 Test 类的放置 new 运算符?还是我误会了?

我当然可以在本地复制 boosts 实现并添加对放置新操作符的调用。但是,这是否合适,还是会违反放置 new 的预期语义?

提前感谢您的时间和帮助。

0 投票
2 回答
10843 浏览

c++ - std::make_shared 构造函数中的参数数量

在 Visual Studio 2010/2011 中没有可变参数模板(仍然!)的情况下,采用大量参数的构造函数可能会出现问题。例如以下将无法编译:

,因为它有 13 个参数,我认为 make_shared 限制在 arg0 到 arg9。显而易见的解决方法是两部分构造,但我希望避免这种情况。除了使用new而不是 make_shared之外,这里还有其他可能性吗?

谢谢。

0 投票
2 回答
12804 浏览

c++ - 初始化 shared_ptr 成员变量,新 vs make_shared?

初始化 shared_ptr 成员变量时:

对比

是否允许使用 make_shared 版本?我似乎总是看到第一个版本,哪个是首选?

0 投票
1 回答
8068 浏览

c++ - C++11 将“this”作为 std::make_shared 的参数传递

我正在尝试使用 std::make_shared 将“this”传递给构造函数

例子:

但是,这不能正常工作,有什么建议我可以正确地将其作为参数传递吗?

0 投票
1 回答
482 浏览

c++ - 使用不完整类型的 make_shared

我正在尝试切换我的代码以使用make_shared<type>()但我有很多不完整的类型(在创建时完成)并且想知道是否有 make_shared 可以使用不完整的类型或允许我传递删除器类型。

我环顾四周,没有找到任何与此相关的帖子,所以要么这行得通吗??或者我忽略了一些基本的东西。

以上是我用来创建新对象的宏。想将其转换为

编辑:只是为了澄清我想问一下我是否可以将删除器类型传递给shared_ptr创建的make_shared

0 投票
3 回答
3862 浏览

c++ - 为什么 boost 没有 make_scoped()?

Boost 的make_shared()函数在尝试创建shared_ptr.

为什么没有make_scoped()等价物?有共同的最佳实践吗?

boost::scoped_ptr这是文档中对我来说似乎不安全的代码示例:

这行代码将按顺序完成这三件事:

  • 分配堆内存为Shoe
  • 调用构造函数Shoe
  • 调用构造函数boost::scoped_ptr<Shoe>

如果 for 的构造函数Shoe抛出异常, 就会导致内存泄漏。 (请参阅 R. Martinho Fernandes 的回答)scoped_ptr不会处理释放,因为它尚未构建。

这是疏忽吗?或者有没有我没有注意到的解决方案?

0 投票
1 回答
369 浏览

c++ - 使用带有继承的 boost::make_shared

考虑两个类

现在我们可以这样做main()

现在使用boost库的版本

我的问题是,在使用该boost版本时,是否可以使用这种方式,即两个版本都可以以相同的方式使用,还是我需要做一些额外的事情(我不太了解 boost 的内部原理)

0 投票
3 回答
853 浏览

c++ - 使用 std::make_shared() 的数据缓存影响

我在这里读到:

make_shared (实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配。相比之下,接受裸对象指针的 shared_ptr 的构造函数必须为引用计数分配另一个动态变量

这是否意味着使用 std::make_shared 创建的 std::shared_ptr 向量将是“缓存友好的”,因为数据(控制块和实际指针的数据)在一个块中?

我的用例是一个包含 100 000 个共享指针的向量,其中指向的对象是 14 个字节。