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

C++未初始化默认构造函数触发munmap_chunk(): invalid pointer错误原因求解

问题原因分析

1. 两种初始化方式的差异

你定义的Foo类默认构造函数用= default显式默认实现,且没有在构造函数内初始化size和ar两个内置类型成员:

  • 当写Foo g;时执行默认初始化:对于内置类型的非静态成员,不会执行初始化,两个成员的值都是内存中残留的随机垃圾值。
  • 当写Foo g{};时执行值初始化:该场景下会先对整个对象执行零初始化,再调用默认构造函数,最终size被初始化为0,ar被初始化为nullptr。

2. 不确定指针的定义,和nullptr的区别

不确定值指针指的是指针存储的地址是内存中残留的随机值,指向完全未知、不受程序合法管控的内存区域,和nullptr完全不等价:

  • nullptr是C++标准明确定义的空指针常量,是合法的、语义明确的指针值。
  • 不确定指针的值是完全不可预测的,既可能是空地址,也可能指向已分配的堆内存、栈内存,甚至是系统保护的内存区域。

3. 不确定指针导致崩溃的原因

你的赋值运算符采用了copy-and-swap实现:执行g = f时,会先拷贝构造rhs临时对象,再将g和rhs的成员交换,最后rhs离开作用域时执行析构,调用delete[]释放它持有的ar指针。
如果g初始时ar是不确定的垃圾值:交换后这个垃圾值会被转移到rhs中,delete[]一个非法的随机地址会触发内存分配器的错误检测,你看到的munmap_chunk(): invalid pointer就是glibc检测到你尝试释放不属于它管理的内存地址,直接终止程序。
如果g初始时ar是nullptr:C++标准明确规定delete[] nullptr是合法操作,不会执行任何内存释放动作,不会触发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:03