首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bad_alloc问题

Bad_alloc问题
EN

Stack Overflow用户
提问于 2011-03-10 18:13:25
回答 3查看 745关注 0票数 1

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

代码语言:javascript
复制
curFinalBucket->points.push_back(p);

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

代码语言:javascript
复制
PFinalBucket curFinalBucket;
curFinalBucket = (FinalBucket*)malloc(sizeof(FinalBucket));

奇怪的是,如果我简单地将上面的代码放在main中,也没有例外。但是当我这样说的时候,

代码语言:javascript
复制
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]);
}

它将抛出有问题的异常。你知道这是怎么回事吗?提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-10 18:17:52

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

我猜FinalBucket大概是这样的:

代码语言:javascript
复制
 class FinalBucket{
    public:
       vector<PPointT> points;
 }

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

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

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

代码语言:javascript
复制
PFinalBucket curFinalBucket;
curFinalBucket = new FinalBucket();
curFinalBucket->points.push_back(p);
票数 7
EN

Stack Overflow用户

发布于 2011-03-10 18:21:45

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

另外,关于样式,将指针隐藏在宏/类型定义后面(如PFinalBucket )会增加代码的可读性。只需编写FinalBucket *就可以了,它会更清晰。

票数 1
EN

Stack Overflow用户

发布于 2011-03-10 18:23:31

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5258191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档