问题标签 [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.
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
?
c++11 - std::forward 和调用 std::make_shared 的工厂
我有这样的代码......
现在考虑使用对象工厂相同的...
这是一个简化的示例,但我在使用工厂时看到了无法解释的崩溃,这似乎是由于共享指针损坏。
我不熟悉 的内部结构std::make_shared
,但我想知道它是否反过来会做类似参数转发到放置的事情::new
,并且这种链转发是一个问题。
c++ - 如何修复“在一个大小为 64 的块内的大小为 8 - 40 字节的无效读取”
m_PhyToBtMap 中的 SPacket 中的 shared_ptr 似乎导致“在大小为 64 的块内的大小为 8 - 40 字节的无效读取已释放。” 注意:在 valgrind(下面的日志)发出此错误消息之前,这运行了近 22 小时,有数百万条消息,但我也在 EraseAcknowledgedPackets(下面)中收到 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 日志
c++ - 使用 boost::make_shared 分配 char* 数组
要分配一个 char* 数组,我通常会写如下内容:
如何使用 boost::shared_ptr(或者可能是 boost::shared_array)和 boost::make_shared 来实现相同的目标?
我的猜测是:
最后一个看起来是对的,但是否保证在销毁时会调用 delete [] arr ?
c++ - C ++ 11中线程之间的共享文件日志记录
最近我开始学习 C++ 11。我在大学时只学习了一小段时间 C/C++。我来自另一个生态系统(Web 开发),所以你可以想象我对 C++ 还比较陌生。
目前我正在研究线程以及如何使用单个编写器(文件句柄)从多个线程完成日志记录。所以我根据教程和阅读各种文章编写了以下代码。
- 我的第一个问题和要求是指出我忽略的任何不良做法/错误(尽管代码适用于 VC 2015)。
- 其次,我主要担心的是我没有关闭文件句柄,我不确定这是否会导致任何问题。如果确实如此,何时以及如何关闭它是最合适的方式?
- 最后,如果我错了,请纠正我,我不想在另一个线程正在写入时“暂停”一个线程。我每次都在一行一行地写。是否存在输出在某些时候混乱的情况?
非常感谢您的宝贵时间,下面是源代码(目前出于学习目的,一切都在里面main.cpp
)。
PS1:在这种情况下,只有 1 个文件句柄可供线程记录数据。
PS2:理想情况下,文件句柄应该在程序退出之前关闭......应该在 Logger 析构函数中完成吗?
更新
当前具有 1000 个线程的输出如下:
到现在都没看到垃圾。。。
c++ - 尝试使用 make_shared 时出错 - 对不完整类型 'char[]' 的“sizeof”使用无效
我一直在尝试在 C++ 中动态分配共享指针。但是,我不断收到错误
使用 std::shared_ptr 我得到类似的错误。
我需要一种在不使用新关键字的情况下分配动态数组的方法,因为这些是项目要求,因此另一种方法对我来说也是一个有效的解决方案。
c++ - 共享指针不增加 use_count
我试图了解如何std::shared_ptr
在 C++ 中使用。但这很令人困惑,我不明白如何创建指向同一个对象的多个共享指针。甚至文档和在线资料也不是很清楚。
以下是我编写的一小段代码,用于尝试理解std::shared_ptr
的行为:
根据我得到的输出,两者都ptr1
指向ptr2
同一个Node
对象,但它们use_count
都是 1。即使使用std::make_shared
也不起作用,程序在退出前崩溃。
你能告诉我我做错了什么吗?以及如何创建shared_ptr
指向同一个对象的多个(s)。
c++ - C++17 中的 std::make_shared() 更改
在cppref中,在 C++17 之前,以下内容一直有效:
诸如此类的代码如果在调用之后并引发异常,
f(std::shared_ptr<int>(new int(42)), g())
可能会导致内存泄漏,而这是安全的,因为两个函数调用永远不会交错。g
new int(42)
f(std::make_shared<int>(42), g())
我想知道 C++17 中引入的哪个更改使这不再适用。
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
?先感谢您!
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。