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

c++ - 如何计算对象和 shared_ptrs 的对齐方式?

假设我有一个由共享指针管理的对象:shared_ptr<X>. 假设我的X类有 98 个字节大,最后一个数据成员位于字节 97-98(一个字符)。

一般来说,共享 ptr 包含一个指向我的X对象的原始指针和一个指向引用计数对象的原始指针,该对象包含两个计数器(一个强引用计数器和一个弱引用计数器)。

引用计数对象将从哪个地址开始(即两个引用计数的位置)?它会在我的X课程结束后,即第 98 个字节之后立即出现吗?或者会有一个特定的数字对齐方式,比如 32 字节对齐,它会在第 128 个字节处?一般由什么决定位置?

假设make_shared已使用。

0 投票
1 回答
313 浏览

c++ - boost::make_shared 底层对象和引用计数对象的内存分配大小在哪里?

我试图了解boost::make_shared由 aboost::shared_ptr和引用计数对象(shared_ptr使用)管理的对象的内存分配是如何一起的。

函数从这里make_shared开始执行:

有人可以帮助解释其余的行吗?

我试图确定大容量内存分配(指向的对象shared_ptr 引用计数对象)的大小是在哪里确定的?

让我感到震惊的是,在分配要分配的地址时,调用address()似乎没有考虑对象的大小。T

(我真的不明白AX进入方法并传递给放置new()调用的三个参数是什么)

0 投票
3 回答
5779 浏览

c++ - 使用 make_shared 时会发生什么

如果这两行代码相同,我很感兴趣:

如果这是真的,有人可以解释为什么第二行只有一个分配吗?

0 投票
1 回答
119 浏览

c++ - 是什么阻止编译器自动推断使用 make_shared?

我明白:

比:

我了解这些优势。但是,我不明白为什么编译器不能有这样的规则

“如果我new()在同一行看到shared_ptr声明,请使用 make_shared

那么是什么阻止编译器自动使用make_shared并要求我们指定它呢?

0 投票
1 回答
1001 浏览

c++ - std::make_shared(new Foo()) 是否创建单例?

std::make_shared(new Foo())被调用时,它构造一个 Foo 并std::shared_ptr<Foo>为调用者返回一个(即此处)。如果从各种对象多次调用它,它是否new Foo()每次都构造一个?在这种情况下,与每个调用者获得对新对象的单个引用没有什么不同,实际上就像 unqiue_ptr 一样?

或者它Foo()是第一次创建一个然后返回std::shared_ptrs ,知道它会像某种单例一样(当然,一旦最后一个std::shared_ptr被销毁就删除)?这个平台是特定的吗?

特别是这样的功能:

0 投票
3 回答
901 浏览

c++ - c++ std::make_shared 与新宏

我使用宏代替new在调试模式下获取一些额外信息:

我发现这在自定义内存分析和内存泄漏检测中非常有用。我刚开始使用共享指针,所以现在我正在制作堆对象,例如:

我刚刚了解到这std::make_shared是首选,因为它使用更少的内存分配。有什么办法可以包括我SAGE_NEWmake_shared吗?我意识到泄漏检测并不重要,但我仍然希望它用于内存使用统计。似乎allocate_shared以某种方式掌握了答案,但我还没有弄清楚。谢谢!:)

编辑:对于那些询问new-我用自定义重载它new。编译器选项 SAGE_MEM_INFO 打开泄漏检测和内存使用统计信息,否则它会跳过日志记录并直接进入我的内存池分配。我有 new[] 和 delete[] 变体,但为简洁起见,我省略了这些变体:

0 投票
1 回答
1426 浏览

c++ - 为什么 shared_ptr<> 必须分别为控制块和托管对象分配?

这个链接的问题询问make_shared<>函数和shared_ptr<>构造函数是否不同。

使用 make_shared 时会发生什么

部分答案是,make_shared<>通常会在一次分配中为指向对象和智能指针控制块分配内存。构造shared_ptr<>函数使用两个分配。

cppreference声明构造函数“必须”这样做,但没有给出任何理由。

为什么是这样?由于某种原因是不可能的吗?还是由于其他原因被标准禁止?

0 投票
4 回答
4619 浏览

c++ - new 和 make_shared 用于共享指针

我遇到了这篇文章和@kerek SB 的答案之一

在您的代码中,第二个变量只是一个裸指针,根本不是共享指针。

现在在肉上。make_shared (实际上)更有效,因为它在一个动态分配中将引用控制块与实际对象一起分配。相比之下,接受裸对象指针的 shared_ptr 的构造函数必须为引用计数分配另一个动态变量。权衡是 make_shared(或其表亲 allocate_shared)不允许您指定自定义删除器,因为分配是由分配器执行的。

(这不影响对象本身的构造。从Object的角度来看,两个版本之间没有区别。更有效的是共享指针本身,而不是托管对象。)

现在我对这篇文章有两个问题,如果有人能澄清这一点,我将不胜感激

  1. 为什么第二个不是共享指针?这不会增加引用计数吗

  2. make_shared 如何只分配一个内存而 new 分配两个从而使 make_shared 更有效?

对此稍作澄清将不胜感激。

0 投票
1 回答
3673 浏览

c++11 - C++11:“make_shared”不是“std”的成员

我正在尝试更新我的一些代码,并尝试包含make_shared.

我创建了一个名为 Mail 的类来发送电子邮件,现在我尝试包含它:

问题是我正在使用Makefile:

编译还包括此标志:

但我收到以下错误:

我在这里做错了什么?

0 投票
1 回答
76 浏览

c++ - 构造函数采用 shared_ptr

我有这样的情况

我想制作 Bar,我想到了 2 种方法

第一个很笼统,因为如果我要更改类型,FooPtr也许我不必更改此代码。但new我猜它使用的是不好的。

Second 不使用new,但它假定它shared_ptr也不通用。

有什么方法可以让它工作并通用吗?或者也许我不应该在构造函数中使用一些 ptrs?

(我存储ptrconst Foo因为我会复制Bar和更改index_,但datainptr_会是一样的 - 你可以假设这Foo是一些容器的大问题)