操作员删除签名意外行为[重复]

2023-12-10

stroustroup 在他的《C++ 编程语言》(第 4 版)一书中提到,可以通过编写具有以下签名的全局函数来重载全局运算符 new & delete:

void* operator new(size_t);               // use for individual object
void* operator new[](size_t);             // use for array
void operator delete(void*, size_t);      // use for individual object
void operator delete[](void*, size_t);    // use for array

NOTE:为删除传递 size_t 参数,以确定正确的对象大小,特别是在删除基指针指向的派生对象时(基指针需要虚拟 dtor,以便传递正确的大小)。

我试图重载单个对象的全局版本。运算符 new 工作正常。具有上述签名的运算符删除工作正常,但删除不会被调用。如果我更改删除签名,使其只需要一个 void *,它就会被调用。可能是什么问题呢:

这是代码:

void * operator new (size_t size)
{
    cout << "My operator new called\n";
    auto p = malloc(size);
    return p;
}

void operator delete (void * ptr, size_t size) // Removing size_t parameter makes it work
{
    cout << "My operator delete called\n";
    free(ptr);
}

奇怪的是,如果我让操作符删除一个类的成员,以便它只为该类重载,那么两个删除签名(带 size_t 和不带 size_t)似乎都有效!

正如我提到的注释中所解释的那样,在删除中传递 size_t 参数似乎是合乎逻辑的。但这种行为的原因可能是什么?我正在使用 VS2013 来测试示例。


来自 C++1y 草案:

5.3.5 删除[expr.delete]

[...]
11 当执行删除表达式时,应调用选定的释放函数,将要回收的存储块的地址作为其第一个参数,并且(如果使用两参数释放函数)将块的大小作为其第一个参数。第二个论点.83

脚注83)如果要删除的对象的静态类型完整且与动态类型不同,并且析构函数不 virtual,大小可能不正确,但如上所述,这种情况已经未定义。

17.6.4.6 替换函数[replacement.functions]

1 第 18 条至第 30 条以及附录 D 描述了 C++ 标准库定义的众多函数的行为。然而,在某些情况下,这些函数描述中的某些也适用于程序(17.3)中定义的替换函数。
2 C++ 程序可以提供头文件中声明的 12 个动态内存分配函数签名中的任何一个的定义<new>(3.7.4、18.6):

operator new(std::size_t)
operator new(std::size_t, const std::nothrow_t&)
operator new[](std::size_t)
operator new[](std::size_t, const std::nothrow_t&)
perator delete(void*)
operator delete(void*, const std::nothrow_t&)
operator delete[](void*)
operator delete[](void*, const std::nothrow_t&)

我的注释:接下来的四个是 C++1y 中的新内容

operator delete(void*, std::size_t)
operator delete(void*, std::size_t, const std::nothrow_t&)
operator delete[](void*, std::size_t)
operator delete[](void*, std::size_t, const std::nothrow_t&)

3 使用程序的定义来代替实现 (18.6) 提供的默认版本。这种替换发生在程序启动之前(3.2、3.6)。程序的定义不得指定为内联。无需诊断。

另请看一下在 C++1y 中引入大小释放的提案:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3536.html

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

操作员删除签名意外行为[重复] 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 无法将字符串文字分配给装箱的 std::string 向量

    这是我的类型系统的简化版本 include

随机推荐

  • DateRangePicker 与 Datatable - 合并两个搜索列

    在我插入 DaterangePicker 的漫长过程中数据表 我现在想使用两个日期范围选择器输入来组合两列搜索来过滤两个不同的列日期 但是 当您只想在一列中搜索时 它会起作用 但当您想搜索两列时 行为会不稳定 例如 如果您想搜索上个月的创建
  • Android 中的 AES 密钥生成

    目前我正在生成 AES 加密 解密的密钥 密钥基于密码和每个用户的随机盐 我的第一个想法是使用算法 PBKDF2WithHmacSHA1 制作一个 SecretKeyFactory 问题是Android目前不支持 进行一些搜索后 我发现埃里
  • 根据第二个数组中的值过滤对象数组

    我有一个对象数组 我想根据任何键的值是否与另一个数组中的任何值匹配来过滤它以创建一个新数组 const array1 name pink id 13 name orange id 17 name red id 64 name purple
  • 使用 ResourceDictionary 中的默认样式时,VS2008 XAML 设计器出现异常“Key不能为空”

    我使用共享的 ResourceDictionary 来定义默认样式 并且与 Visual Studio 2008 中的 XAML 设计器存在重大冲突 键不能为空对于所有显示 XAML 设计视图的尝试都会出现 该字典被合并到 App xaml
  • 哈希码总是相同的?

    我想知道HashCode是否总是相同的 例如 String myString my super string Int myHashCode myString GetHashCode Will myHashCode总是相同的值 在任何计算机上
  • 使具有多个文件名的“sed”的单个实例跳到下一个文件

    The next命令输入sed跳到下一行 但是对于多个文件 似乎没有任何命令可以跳到下一个文件 是否有任何解决方法仅使用single调用sed 问题演示 制作两个简单的 3 数数据文件 seq 3 gt three seq 10 1 13
  • 无法解析主机 github.com

    虽然我也有同样的问题question 但我面临着另一个问题 即 即使https github com 未在浏览器中运行并显示该网页不可用 这是在我安装 Heroku 后发生的 无法从终端访问 github 甚至无法从浏览器访问 诊断后我发现
  • 如何在Python中将字典项作为函数参数传递? [复制]

    这个问题在这里已经有答案了 My code 第一个文件 data school DAV standard 7 name abc city delhi my function data 第二个文件 my function data schoo
  • Shiny 仪表板内的 HTML 页面

    我的问题对于某些人来说很简单 但对于其他人 例如我 来说却很困难 I have a Shiny Dashboard in wich I want to add an html page inside a menuItem Se connec
  • 将 3 个列表合并为 1 个列表 [重复]

    这个问题在这里已经有答案了 我想将 3 个列表合并为一个列表 例如 我有三个列表 a 0 3 6 9 b 1 4 7 10 c 2 5 8 11 最后我想得到 merged 0 1 2 3 4 5 6 7 8 9 10 11 out of
  • 资源(.resx)文件有什么好处?

    使用它们有哪些令人信服的理由 资源文件根据用户的区域设置自动确定要使用的语言 resx 文件 为您提供了一种本地化 国际化 net 应用程序的简单方法 要添加更多语言 只需添加另一个翻译的资源文件即可 资源文件为您提供了一个存储字符串 文件
  • 删除 BottomNavigationView 标签

    谷歌发布了带有BottomNavigationView的新支持库v25 有什么办法可以去除物品标签吗 我希望我参加这里的聚会还不算太晚 但从设计支持库 28 0 0 alpha1 开始 您可以使用该房产 app labelVisibilit
  • ViewModel 在操作方法中获取空值

    我正在使用 ViewModel 来检索控制器操作中输入的数据 但 ViewModel 在其属性中获取空值 我正在创建一个局部视图 在那个局部视图中我正在创建下拉列表通过绑定 ViewModel 然后我渲染其他人的那部分观点View 下面是我
  • 使用 php 上传最大 100MB 的大文件

    我正在使用 PHP 制作一个文件托管网站 例如 Web 托管网站 megaupload rapidshare mediafire 等 或者告诉我它是否易于在 ASP NET 中实现 项目即将完成 但上传模块无法正常工作 我用谷歌搜索但找不到
  • 如何从 HTTP 处理程序中的 URL 获取参数

    我正在开发一个 Web 服务应用程序 其端点 加密货币 汇率接受两个货币 符号 作为输入 Web 服务应在数据库中搜索这些字符之间的货币兑换数据 如果数据库中没有值 或者时间戳值与当前值相差超过 1 分钟 则向服务 API 发出请求 htt
  • C# 中 async 总是异步吗? [复制]

    这个问题在这里已经有答案了 我正在做研发async and await对于我的项目 我学到的是 当async方法被调用时 它释放线程并让该线程被其他线程使用 我们可以使用可等待方法设置回调await关键字 并且该方法在结果准备好时返回值 如
  • Qt 对话框窗口的动态翻译

    我正在创建一个 Qt 应用程序 并添加了动态翻译 我按照以下示例进行操作 http www qtcentre org wiki index php title Dynamic translation in Qt4 applications
  • SQL Server:CROSS JOIN 和 FULL OUTER JOIN 之间有什么区别?

    SQL Server 中的 CROSS JOIN 和 FULL OUTER JOIN 有什么区别 它们是相同还是不同 请解释 什么时候会使用其中任何一个 A CROSS JOIN在两个表之间生成笛卡尔积 返回所有行的所有可能组合 它没有ON
  • ASP.Net 4.5 模型绑定按导航属性排序

    All 我有一个包含以下列的网格视图 分页效果很好 但排序不行 每次我单击类别列按类别排序时 我都会收到此错误 未为类型 ESA Data Models Entity Project 定义实例属性 Category CategoryName
  • 操作员删除签名意外行为[重复]

    这个问题在这里已经有答案了 stroustroup 在他的 C 编程语言 第 4 版 一书中提到 可以通过编写具有以下签名的全局函数来重载全局运算符 new delete void operator new size t use for i