C++中corrupted size vs. prev_size错误的排查方向咨询
问题描述
我定义了A、B、C三个类,代码片段如下:
class A{ public: A() = default; // some virtual functions virtual ~A() = default; private: // variables; no pointers }; class B: public A{ public: ~B() = default; protected: //variables }; class C: public A{ protected: std::vector<std::unique_ptr<A>> cs; // other variables public: ~C() = default; };
我的代码中存在一个vector<std::unique_ptr<A>>容器,执行push元素和resize操作时,频繁出现如下错误:
corrupted size vs. prev_size Signal: SIGABRT (Aborted)
调试时错误始终指向析构函数代码行,但代码库规模较大,难以生成最小可复现示例。请问应该重点检查代码中的哪些部分?
排查方向
- 内存越界访问检查:
corrupted size vs. prev_size通常是堆内存被破坏的表现,优先排查:- 所有操作
A、B、C成员变量的代码,尤其是数组下标、指针偏移是否超出合法范围; - 是否存在访问已被
unique_ptr释放的对象内存的情况;
- 所有操作
- 拷贝/移动语义正确性检查:
- 若
B或C手动实现了拷贝构造/赋值运算符,确认没有违反unique_ptr的不可拷贝特性(比如直接复制容器或unique_ptr,会导致双重释放); - 移动构造/赋值函数是否正确转移了
cs容器及其中unique_ptr的所有权,有没有遗漏导致的资源重复管理;
- 若
unique_ptr管理对象的合法性检查:- 确认所有存入
cs的unique_ptr指向的是堆上分配的对象,绝对不能将栈对象的地址交给unique_ptr(栈对象销毁时会触发重复释放); - 避免将同一个裸指针同时交给多个
unique_ptr,这会导致析构时多次释放同一块内存;
- 确认所有存入
- 递归析构问题检查:
- 排查
C对象的cs容器中是否存放了自身的指针,这种情况会在析构时触发递归调用,破坏堆结构或导致栈溢出;
- 排查
- 多线程竞态条件检查:
- 如果是多线程环境,确认对
cs容器的所有操作(push/resize/析构)都有正确的同步锁保护,无保护的并发修改会直接破坏容器内部的堆结构;
- 如果是多线程环境,确认对
- 类成员内存布局与初始化检查:
- 检查
B或C的成员变量是否存在未初始化的指针/引用,或者内存对齐错误,这类问题可能在析构时间接破坏堆管理信息;
- 检查
内容的提问来源于stack exchange,提问作者user2987773
相关产品推荐
相关产品推荐

