为何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();,这会导致对象被构造两次:
- 调用重载的
operator new时,用全局new创建了一个默认构造的person - 返回地址后,编译器又会在这个地址上调用带参数的构造函数
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
相关产品推荐
相关产品推荐

