结构的C ++向量与导致异常的结构中的向量

时间:2012-10-26 16:54:36

标签: c++ stl vector struct

我遇到了以下代码的问题,从小时起我无法解决这个问题...... 我很高兴有任何建议。

类型定义如下:

typedef std::vector< cv::RotatedRect > ds_t;

typedef struct id_ {
std::string path;
std::string fileName;
} id_t;

typedef struct dd_ {
    cv::RotatedRect bB;
} dd_t;

typedef std::pair<id_t, std::vector<dd_t> > ts_t;

typedef std::vector<ts_t> tss_t;

然后我尝试用数据填充类型:

tss_t samples
while (readdir(pDir) != NULL) {
     ts_t sample;
     sample.first.path = _path;
     sample.first.fileName = _name;
     ds_t detections;
     getDetections(_path, detections); //this only filles the detecions byref
     for(size_t i=0; i<detections.size(); i++) {
         dd_t data;
         data.bB = detections[i];
         sample.second.push_back(data); //TODO FIXME
     }
     samples.push_back(sample);
 }

cv :: RotatedRect是一个非常基础的类。

class RotatedRect{
   public:
   RotatedRect();
   RotatedRect(const Point2f& _center, const Size2f& _size, float _angle);
   void points(Point2f pts[]) const;

   Point2f center;
   Size2f size;
   float angle; 
};

bool getDetections(const std::string &imagePath, ds_t &detections)
{
  //some processing
  for(size_t i=0;i<5;i++)
    detections.push_back(RotatedRect(cv::Point2f(110.,110.), cv::Size2f(10.,10.), 90.0f));

  return true;
}

希望我复制了整个代码,我知道,我不需要大多数typedef ...

我已经尝试保留space sample.second.reserve(detections.size()),但这只会将错误推迟到samples.push_back。

错误的行由FIXME指示,导致“在抛出'std :: bad_alloc'的实例后调用终止”

感谢您提前获得任何建议。

1 个答案:

答案 0 :(得分:1)

std::bad_alloc通常意味着你的内存耗尽 - 可能是因为泄漏,或者仅仅是因为你分配了太多。它也可能(很少)发生由于堆损坏(在已分配的数组的末尾运行或在删除指针后取消引用指针)或程序中某些早期点的其他未定义行为。

您的程序一次尝试使用多少内存?您可以尝试使用valgrind之类的检漏仪来查看是否有应该清理的东西。

修改

-1 to __builtin_new告诉你很多 - 它告诉你有人正在以虚假的大小打电话给新人。那可能是std :: vector的成员,它试图调整大小(你可以从valgrind检查堆栈跟踪或使用调试器来确定),这表明向量已经被破坏了。由于sample.second是一个本地(堆栈上)变量,它告诉你你调用的前一个函数(可能是getDetections)覆盖了一个onstack缓冲区或某种类型的数组并被破坏sample.second。因此,请仔细查看该函数正在执行的操作 - 您已注释为//some processing的代码。您还可以尝试使用调试器在创建sample之后设置断点,然后在sample.second使用的内存上设置一个已损坏的监视点。然后继续该程序,它应该停止在破坏sample.second

的点

读取编译器的头文件以确定它如何实现std :: vector可能会有所帮助 - 那里可能有几个size_t字段和一个指针字段。