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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:00:59