2

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

类型定义如下:

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;
}

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

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

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

感谢您提前提供任何建议。

4

1 回答 1

1

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

您的程序一次尝试使用多少内存?您可以尝试使用像valgrind这样的检漏仪来查看是否有需要清理的东西。

编辑

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

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

于 2012-10-26T17:32:07.400 回答