问题标签 [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_ptrs 的对齐方式?
假设我有一个由共享指针管理的对象:shared_ptr<X>
. 假设我的X
类有 98 个字节大,最后一个数据成员位于字节 97-98(一个字符)。
一般来说,共享 ptr 包含一个指向我的X
对象的原始指针和一个指向引用计数对象的原始指针,该对象包含两个计数器(一个强引用计数器和一个弱引用计数器)。
引用计数对象将从哪个地址开始(即两个引用计数的位置)?它会在我的X
课程结束后,即第 98 个字节之后立即出现吗?或者会有一个特定的数字对齐方式,比如 32 字节对齐,它会在第 128 个字节处?一般由什么决定位置?
假设make_shared
已使用。
c++ - boost::make_shared 底层对象和引用计数对象的内存分配大小在哪里?
我试图了解boost::make_shared
由 aboost::shared_ptr
和引用计数对象(shared_ptr
使用)管理的对象的内存分配是如何一起的。
函数从这里make_shared
开始执行:
有人可以帮助解释其余的行吗?
我试图确定大容量内存分配(指向的对象和shared_ptr 引用计数对象)的大小是在哪里确定的?
让我感到震惊的是,在分配要分配的地址时,调用address()
似乎没有考虑对象的大小。T
(我真的不明白AX
进入方法并传递给放置new()
调用的三个参数是什么)
c++ - 使用 make_shared 时会发生什么
如果这两行代码相同,我很感兴趣:
如果这是真的,有人可以解释为什么第二行只有一个分配吗?
c++ - 是什么阻止编译器自动推断使用 make_shared?
我明白:
比:
我了解这些优势。但是,我不明白为什么编译器不能有这样的规则
“如果我
new()
在同一行看到shared_ptr
声明,请使用make_shared
”
那么是什么阻止编译器自动使用make_shared
并要求我们指定它呢?
c++ - std::make_shared(new Foo()) 是否创建单例?
当std::make_shared(new Foo())
被调用时,它构造一个 Foo 并std::shared_ptr<Foo>
为调用者返回一个(即此处)。如果从各种对象多次调用它,它是否new Foo()
每次都构造一个?在这种情况下,与每个调用者获得对新对象的单个引用没有什么不同,实际上就像 unqiue_ptr 一样?
或者它Foo()
是第一次创建一个然后返回std::shared_ptr
s ,知道它会像某种单例一样(当然,一旦最后一个std::shared_ptr
被销毁就删除)?这个平台是特定的吗?
特别是这样的功能:
c++ - c++ std::make_shared 与新宏
我使用宏代替new
在调试模式下获取一些额外信息:
我发现这在自定义内存分析和内存泄漏检测中非常有用。我刚开始使用共享指针,所以现在我正在制作堆对象,例如:
我刚刚了解到这std::make_shared
是首选,因为它使用更少的内存分配。有什么办法可以包括我SAGE_NEW
的make_shared
吗?我意识到泄漏检测并不重要,但我仍然希望它用于内存使用统计。似乎allocate_shared
以某种方式掌握了答案,但我还没有弄清楚。谢谢!:)
编辑:对于那些询问new
-我用自定义重载它new
。编译器选项 SAGE_MEM_INFO 打开泄漏检测和内存使用统计信息,否则它会跳过日志记录并直接进入我的内存池分配。我有 new[] 和 delete[] 变体,但为简洁起见,我省略了这些变体:
c++ - 为什么 shared_ptr<> 必须分别为控制块和托管对象分配?
这个链接的问题询问make_shared<>
函数和shared_ptr<>
构造函数是否不同。
部分答案是,make_shared<>
通常会在一次分配中为指向对象和智能指针控制块分配内存。构造shared_ptr<>
函数使用两个分配。
cppreference声明构造函数“必须”这样做,但没有给出任何理由。
为什么是这样?由于某种原因是不可能的吗?还是由于其他原因被标准禁止?
c++ - new 和 make_shared 用于共享指针
我遇到了这篇文章和@kerek SB 的答案之一
在您的代码中,第二个变量只是一个裸指针,根本不是共享指针。
现在在肉上。make_shared (实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配。相比之下,接受裸对象指针的 shared_ptr 的构造函数必须为引用计数分配另一个动态变量。权衡是 make_shared(或其表亲 allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的。
(这不影响对象本身的构造。从Object的角度来看,两个版本之间没有区别。更有效的是共享指针本身,而不是托管对象。)
现在我对这篇文章有两个问题,如果有人能澄清这一点,我将不胜感激
为什么第二个不是共享指针?这不会增加引用计数吗
make_shared 如何只分配一个内存而 new 分配两个从而使 make_shared 更有效?
对此稍作澄清将不胜感激。
c++11 - C++11:“make_shared”不是“std”的成员
我正在尝试更新我的一些代码,并尝试包含make_shared
.
我创建了一个名为 Mail 的类来发送电子邮件,现在我尝试包含它:
问题是我正在使用Makefile:
编译还包括此标志:
但我收到以下错误:
我在这里做错了什么?
c++ - 构造函数采用 shared_ptr
我有这样的情况
我想制作 Bar,我想到了 2 种方法
第一个很笼统,因为如果我要更改类型,FooPtr
也许我不必更改此代码。但new
我猜它使用的是不好的。
Second 不使用new
,但它假定它shared_ptr
也不通用。
有什么方法可以让它工作并通用吗?或者也许我不应该在构造函数中使用一些 ptrs?
(我存储ptr
是const Foo
因为我会复制Bar
和更改index_
,但data
inptr_
会是一样的 - 你可以假设这Foo
是一些容器的大问题)