数组放置新需要缓冲区中未指定的开销?

2024-03-13

5.3.4 [expr.new]C++11 Feb 草案给出了示例:

new(2,f) T[5]结果调用operator new[](sizeof(T)*5+y,2,f).

这里,x和y是非负未指定值,表示数组分配开销;的结果新表达将从返回的值中抵消此金额operator new[]。此开销可能适用于所有数组新表达,包括那些引用库函数的operator new[](std::size_t, void*)和其他布局分配功能。每次 new 调用与另一次调用之间的开销量可能会有所不同。—结束示例 ]

现在采用以下示例代码:

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];

根据上面的引用,第二行new (buffer) std::string[10]会内部调用operator new[](sizeof(std::string) * 10 + y, buffer)(在构建个体之前std::string对象)。问题是如果y > 0,预分配的缓冲区会太小!

那么,在使用 arrayplacement-new 时,我如何知道要预分配多少内存呢?

void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];

或者某处的标准是否保证y == 0在这种情况下?再次,引用说:

此开销可能适用于所有数组新表达,包括那些引用库函数的operator new[](std::size_t, void*)和其他布局分配功能。


Update

Nicol Bolas 在下面的评论中正确地指出,这个问题已被修复,这样开销始终为零operator new[](std::size_t, void* p) http://eel.is/c++draft/expr.new#19.sentence-1.

此修复是作为缺陷报告 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2382于 2019 年 11 月发布,这使其追溯至 C++ 的所有版本。

原答案

不要使用operator new[](std::size_t, void* p)除非你先验地知道这个问题的答案。答案是实现细节,并且可以随编译器/平台的不同而改变。尽管它对于任何给定平台通常都是稳定的。例如。这是由安腾ABI http://sourcery.mentor.com/public/cxx-abi/.

如果您不知道这个问题的答案,请编写自己的新放置数组,以便在运行时检查:

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << "life is good\n";
    else
        throw std::bad_alloc();
    return p;
}

int main()
{
    alignas(std::string) char buffer[100];
    std::string* p = new(buffer, sizeof(buffer)) std::string[3];
}

通过改变数组大小并检查n在上面的例子中,你可以推断y为您的平台。为了我的平台 http://sourcery.mentor.com/public/cxx-abi/ y是 1 个字。 sizeof(word) 根据我是针对 32 位还是 64 位体系结构进行编译而有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组放置新需要缓冲区中未指定的开销? 的相关文章

  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 为什么这个函数指针赋值在直接赋值时有效,但在使用条件运算符时无效?

    本示例未使用 include 在 MacOS10 14 Eclipse IDE 上编译 使用 g 选项 O0 g3 Wall c fmessage length 0 假设这个变量声明 int fun int 这无法通过 std touppe
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 序列化和反序列化 Visual Studio 解决方案文件 - 或以编程方式编辑?

    我想以编程方式添加和删除项目 解决方案文件夹和其他项目 例如解决方案的资源文件 但我不确定最好的方法是什么 对于那些不知道的人 高度简化 解决方案文件 sln 通常如下所示 Microsoft Visual Studio Solution
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul

随机推荐

  • 查找垂直点与直线相交的 x 和 y 坐标[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是对此的后续问题question https stackoverflow com questions 32606940 how to f
  • C++、Cheat Engine / OllyDBG 从多级指针查找基“静态”地址

    我又回来了 沮丧并拼命寻求帮助 D 我正在尝试为一个简单的程序创建一个作弊程序 它基本上是一个 dll 文件 当使用其基地址注入主程序时 它将更改主程序中的整数值 问题是 我无法使用作弊引擎找到它 主要是因为有多个带有负数的级别指针 偏移量
  • ZXing.Net 将字符串编码为 CF 中的二维码

    我怎样才能使用将我的字符串编码成二维码中兴网 http zxingnet codeplex com 我已经可以解码 但在编码时遇到问题 它有一个错误说 没有适用于 AZTEC 格式的编码器 这是我的代码 IBarcodeWriter wri
  • node-express 如何在 URL 查询字符串中传递 DATE 参数以及如何解析它

    我有一个基于 Angular 2 构建的应用程序 该服务发送 http 请求以从 Oracle DB 获取数据 使用 Node Oracle DB 和 Express 框架 我已经使用express构建了rest api 现在我需要在请求参
  • Android 7.0 无法获取“/”目录下的文件列表

    在 Android 7 0 之前 我能够获取下面的文件列表 目录 但在 Android 7 0 版本上 当我尝试从中获取文件列表时 我得到 null 目录 下面是我的代码 File root new File File files root
  • rmagick gem install “找不到 Magick-config”

    尝试安装 rmagick gem 时出现如下错误 我使用的是 Snowleopard 10 6 使用 RVM Ruby 1 9 2 head 和 Rails 3 05 对类似问题的回答建议安装 ImageMagick 我成功地做到了 其他人
  • C# 高级控制台 I/O [重复]

    这个问题在这里已经有答案了 我想使用控制台执行多个 I O 任务 打印出标准的 不可编辑的文本 Console WriteLine 打印出用户可以编辑的文本 Allow the user to type and be able to out
  • mysql order 和 groupby

    我有一个 MySQL 日志表 它具有以下字段 id status id object id created modified 我想知道获取每个对象最新状态的最佳方法是什么 提前致谢 编辑 我的最后一个解决方案是 SELECT id stat
  • React + Backbone,目标容器不是DOM元素

    Note 这是抛出的反应错误 所以我正在尝试一个实验 我根据该页面从主干路由器渲染一个后组件 现在我知道你通常不会这样做 事情可能会变得混乱等等 但再一次这只是一个实验 所以我在主干中有以下路由 注意反应调用 AisisWriter Rou
  • ValueError:此工作表太大!您的纸张尺寸为:1220054, 3 最大纸张尺寸为:1048576, 16384

    我正在尝试转换 txt文件到Excel文件 我遇到了以下错误 Traceback most recent call last File C Users haroo501 PycharmProjects MyLiveRobo convert
  • 无法让costura.fody将dll嵌入到exe中

    我尝试将类库的 dll 嵌入到我的 exe 中 我使用 Visual Studio 2019 和 net 5 我在一个解决方案中创建了两个项目 一是类库 dll 二是控制台应用程序 两者都针对 net core 5 我选择控制台应用程序作为
  • Django url 模板标签添加绝对文件路径

    我遇到一个问题 我的 url django 模板标记将文件路径添加到生产中的网址 这不会在我的本地开发计算机上复制 通过 urls py 设置 url about us views about us name about us 在生产中 我
  • 创建一个简单的用户界面来访问 Oracle 数据库

    这是我所拥有的 1 给我一个简单的sql文件 它创建表并用数据填充它们 2 一个简单的 sql 文件 其中包含我编写的用于显示 操作表的 PL SQL 过程 目标是创建某种用户界面 允许学生登录 查看成绩单 退出课程等 我正在使用sqlpl
  • 网络共享文件夹上的 GIT 存储库中的并发性

    我想要一个存储在 Windows 网络共享上的裸 git 存储库 我使用linux 并使用CIFS挂载了上述网络共享 我的同事使用 Windows XP 并将网络共享自动安装 以某种方式从 ActiveDirectory 作为网络驱动器 我
  • PHP + PDO:如果参数为空则绑定 null

    我正在尝试这个 并且所有 PoST var 在用户发送之前都会被处理 无需担心 SQL 注入 stmt con gt prepare sql stmt gt bindParam 1 this gt getPes cdpessoa stmt
  • HTML2PDF 无法识别表格的大小

    我正在使用 Yii Extension 开发的网页中工作 并且使用 HTML2PDF 扩展来生成 PDF http html2pdf fr http html2pdf fr 虽然 PDF 生成得很好 但它似乎无法识别我的表格大小 我为一行或
  • FAT32 每个目录的文件数限制

    我目前正在尝试在 Xilinx Kintex 7 卡上用 C 语言编写 FAT 系统 它配备了 MicroBlaze 我已经成功创建了大部分所需的功能 我面临的问题是关于文件夹的总容量 我在网上读到 在 FAT32 中 一个文件夹应该能够包
  • 将 Resharper 测试运行器与 Jasmine 2.0 结合使用

    我正在尝试将 VS2013 中的 Resharper v8 2 测试运行程序与 Jasmine 2 一起使用 但在 beforeEach 调用 全局 时遇到问题 该规范文件有一个对 SpecHelper js 的 脚本引用 该引用调用了 b
  • 从 Kickstarter 项目中抓取文本不会返回任何结果

    我正在尝试从 Kickstarter 项目网页中抓取项目的主要文本 我有以下代码 适用于第一个 URL 但不适用于第二个和第三个 URL 我想知道是否可以轻松修复我的代码而无需使用其他软件包 url https www kickstarte
  • 数组放置新需要缓冲区中未指定的开销?

    5 3 4 expr new C 11 Feb 草案给出了示例 new 2 f T 5 结果调用operator new sizeof T 5 y 2 f 这里 x和y是非负未指定值 表示数组分配开销 的结果新表达将从返回的值中抵消此金额o