Bad_alloc问题

时间:2011-03-10 10:13:25

标签: c++ exception memory memory-leaks

我的程序抛出一个std :: bad_alloc。在调试之后,我发现它被抛出代码

curFinalBucket->points.push_back(p);

其中points是vector<PPointT>。在代码行之前,curFinalBucket初始化如下。

PFinalBucket curFinalBucket;
curFinalBucket = (FinalBucket*)malloc(sizeof(FinalBucket));

奇怪的是,如果我只是将上面的代码放在main中,那就没有例外。但是,当我把它如下,

void mergeBucket(map<BucketT, vector<PPointT>, Comp> *pMap, IntT numFinalBuckets)
{
...
PFinalBucket curFinalBucket;
curFinalBucket = (FinalBucket*)malloc(sizeof(FinalBucket));
curFinalBucket->points.push_back(p);
}

int testLoadBalancedLSH(IntT num_fbuckets, RealT avgNumPossessedTerms, IntT np, IntT d, char* dataFile)
{
...
mergeBucket(&mapstore, num_fbuckets);
}

int main(int nargs, char **args) {
...
testLoadBalancedLSH(atoi(args[1]), 0.01 * atoi(args[2]), atoi(args[2]), atoi(args[3]), args[4]);
}

它会抛出有问题的异常。任何想法这可能是什么?提前谢谢。

3 个答案:

答案 0 :(得分:7)

我认为问题是你用malloc创建了curFinalBucket。这不会调用构造函数,因此当您尝试使用它时,内部vector<PPointT>不会被初始化。

我猜FinalBucket就像:

 class FinalBucket{
    public:
       vector<PPointT> points;
 }

points需要一个未发生的初始化,因为没有调用FinalBucket构造函数,也没有调用vector<PPointT>构造函数。

您只是在分配内存,但您需要调用构造函数进行初始化。

解决这个问题的唯一方法是使用 new 来分配FinalBucket。

PFinalBucket curFinalBucket;
curFinalBucket = new FinalBucket();
curFinalBucket->points.push_back(p);

答案 1 :(得分:1)

(FinalBucket*)malloc(sizeof(FinalBucket));为大小为FinalBucket的对象分配内存,但它实际上并不创建最终的存储桶。您应该使用new FinalBucket()

此外,作为关于样式的注释,隐藏指针(如PFinalBucket之类的宏/ typedef后面的指针会使您的代码更难阅读。只需写一下FinalBucket *,就会更清楚。

答案 2 :(得分:1)

您应该使用 new FinalBucket 来分配动态内存而不是malloc。 new运算符将调用 FinalBucket 的构造函数,其中将初始化该向量。