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

c++ - 什么时候我应该更喜欢 `shared_ptr` 而不是 `make_shared`?

正如对 C++ 中 make_shared 和普通 shared_ptr 差异的答案中所指出的那样,在大多数情况下都make_shared表现出色。shared_ptr

那么为什么 C++ 标准同时定义了这shared_ptr两者make_shared?有没有我更喜欢shared_ptr甚至make_shared只能使用shared_ptr但不能使用的情况make_shared

0 投票
0 回答
407 浏览

c++11 - std::forward 和调用 std::make_shared 的工厂

我有这样的代码......

现在考虑使用对象工厂相同的...

这是一个简化的示例,但我在使用工厂时看到了无法解释的崩溃,这似乎是由于共享指针损坏。

我不熟悉 的内部结构std::make_shared,但我想知道它是否反过来会做类似参数转发到放置的事情::new,并且这种链转发是一个问题。

0 投票
1 回答
888 浏览

c++ - 如何修复“在一个大小为 64 的块内的大小为 8 - 40 字节的无效读取”

m_PhyToBtMap 中的 SPacket 中的 shared_ptr 似乎导致“在大小为 64 的块内的大小为 8 - 40 字节的无效读取已释放。” 注意:在 valgrind(下面的日志)发出此错误消息之前,这运行了近 22 小时,有数百万条消息,但我也在 E​​raseAcknowledgedPackets(下面)中收到 SIGSEGV 崩溃,并怀疑这是原因。我使用的是 Boost 1.63,因为交叉编译器不支持 shared_ptr。SendMessageToBt(大小为 8 的无效读取)和 EraseAcknowledgedPackets(大小为 64 的块内的 40 个字节)在 valgrind 日志中被调用。

  • 我使用 shared_ptr 或 make_shared 不当?
  • 在执行 map.erase 或 insert 之前是否需要添加任何检查?
  • 我是否正确理解了 valgrind 日志?

SPacket 和 m_PhyToBtMap

SendMessageToBt

擦除确认包

valgrind 日志

0 投票
2 回答
1614 浏览

c++ - 使用 boost::make_shared 分配 char* 数组

要分配一个 char* 数组,我通常会写如下内容:

如何使用 boost::shared_ptr(或者可能是 boost::shared_array)和 boost::make_shared 来实现相同的目标?

我的猜测是:

最后一个看起来是对的,但是否保证在销毁时会调用 delete [] arr ?

0 投票
4 回答
2476 浏览

c++ - C ++ 11中线程之间的共享文件日志记录

最近我开始学习 C++ 11。我在大学时只学习了一小段时间 C/C++。我来自另一个生态系统(Web 开发),所以你可以想象我对 C++ 还比较陌生。

目前我正在研究线程以及如何使用单个编写器(文件句柄)从多个线程完成日志记录。所以我根据教程和阅读各种文章编写了以下代码。

  • 我的第一个问题和要求是指出我忽略的任何不良做法/错误(尽管代码适用于 VC 2015)。
  • 其次,我主要担心的是我没有关闭文件句柄,我不确定这是否会导致任何问题。如果确实如此,何时以及如何关闭它是最合适的方式?
  • 最后,如果我错了,请纠正我,我不想在另一个线程正在写入时“暂停”一个线程。我每次都在一行一行地写。是否存在输出在某些时候混乱的情况?

非常感谢您的宝贵时间,下面是源代码(目前出于学习目的,一切都在里面main.cpp)。

PS1:在这种情况下,只有 1 个文件句柄可供线程记录数据。

PS2:理想情况下,文件句柄应该在程序退出之前关闭......应该在 Logger 析构函数中完成吗?

更新

当前具有 1000 个线程的输出如下:

到现在都没看到垃圾。。。

0 投票
0 回答
179 浏览

c++ - 尝试使用 make_shared 时出错 - 对不完整类型 'char[]' 的“sizeof”使用无效

我一直在尝试在 C++ 中动态分配共享指针。但是,我不断收到错误

使用 std::shared_ptr 我得到类似的错误。

我需要一种在不使用新关键字的情况下分配动态数组的方法,因为这些是项目要求,因此另一种方法对我来说也是一个有效的解决方案。

0 投票
3 回答
1239 浏览

c++ - 共享指针不增加 use_count

我试图了解如何std::shared_ptr在 C++ 中使用。但这很令人困惑,我不明白如何创建指向同一个对象的多个共享指针。甚至文档和在线资料也不是很清楚。

以下是我编写的一小段代码,用于尝试理解std::shared_ptr的行为:

根据我得到的输出,两者都ptr1指向ptr2同一个Node对象,但它们use_count都是 1。即使使用std::make_shared也不起作用,程序在退出前崩溃。

你能告诉我我做错了什么吗?以及如何创建shared_ptr指向同一个对象的多个(s)。

0 投票
2 回答
4005 浏览

c++ - C++17 中的 std::make_shared() 更改

cppref中,在 C++17 之前,以下内容一直有效:

诸如此类的代码如果在调用之后并引发异常,f(std::shared_ptr<int>(new int(42)), g())可能会导致内存泄漏,而这是安全的,因为两个函数调用永远不会交错。gnew int(42)f(std::make_shared<int>(42), g())

我想知道 C++17 中引入的哪个更改使这不再适用。

0 投票
1 回答
688 浏览

c++ - C++ std::make_shared

以下代码片段来自 C++ Concurrency In Action Practical Multithreading 第 152 页,一个线程安全的堆栈类。我的问题是为什么下面的 pop 函数(线程安全堆栈类的)不能只是return std::make_shared<T>(std::move(data.top()),其中 data 是类型,std::stack<T>因为make_shared<T>返回 a shared_ptr?先感谢您!

0 投票
1 回答
325 浏览

c++ - boost::make_shared 失败但 std::make_shared 工作

我在 boost::asio 中做了一个 echo-server 示例。但是使用 boost::make_shard 会导致“未知异常”,而 std::make_shared 不会。请参阅注释行。

我正在使用 Visual Studio 2017 和 boost 1.67。注释部分会崩溃,而未注释部分不会。似乎 boost lib 在 boost/stage/lib 中符合 vs141。