You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++中重载new运算符输出的size始终为16?

为什么重载new输出的size始终是16?

嘿,这个问题问到点子上了,我来一步步给你掰扯清楚:

1. 这个size到底指代什么?

你重载的operator new收到的size_t size参数,本质上就是**person类对象本身的静态内存大小**——也就是你写sizeof(person)会得到的数值。它代表为了容纳一个person实例,需要从堆上分配的最小内存块大小。注意:这个大小只包含对象自身成员变量占用的内存,不包含成员变量指向的外部堆内存。

2. 为什么size始终是16,和string的内容无关?

核心原因在于std::string的实现逻辑:

  • std::string是个容器类,它的对象本身并不直接存字符串的字符数据。大多数编译器的std::string实现里,对象本身只是一个"管理结构体"——通常包含指向字符数组的指针、当前字符串长度、已分配内存容量这几个部分(64位系统下,这些成员加起来刚好是16字节,比如8字节指针+4字节长度+4字节容量)。
  • 你的person类包含一个std::string成员和一个int成员,再加上64位系统下的内存对齐规则(通常按8字节对齐),最终sizeof(person)的结果固定为16。
  • 当你修改name的内容时,只是改变了std::string指向的堆内存里的字符数据,而person对象里的std::string成员(那个管理结构体)的大小完全没变,所以sizeof(person)不会变,重载new收到的size自然始终是16。

3. 顺便提下你代码里的小问题

你在重载的operator new里写了void *a = ::new person();,这会导致对象被构造两次:

  1. 调用重载的operator new时,用全局new创建了一个默认构造的person
  2. 返回地址后,编译器又会在这个地址上调用带参数的构造函数person("avi",20)

这很容易引发内存问题,正确的写法应该是只分配内存、不调用构造函数:

void *operator new(size_t size) {
    cout << "Overloading new operator with size: " << size << endl;
    void *a = malloc(size); // 或者用::new char[size]
    return a;
}

内容的提问来源于stack exchange,提问作者Shreya Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:37:45