gpt4 book ai didi

c++ - 将 new 用于结构 C++ 时出现 Bad_alloc 异常

转载 作者:行者123 更新时间:2023-11-30 02:11:56 26 4
gpt4 key购买 nike

我正在编写一个分配大量内存并尝试查找匹配文档的查询处理器。每当我找到匹配项时,我都会创建一个结构来保存描述文档的两个变量,并将其添加到优先级队列中。由于无法知道我将执行多少次,因此我尝试使用 new 动态创建我的结构。当我从优先级队列中弹出一个结构时,队列(STL 优先级队列实现)应该调用对象的析构函数。我的结构代码没有析构函数,所以我假设在这种情况下会调用默认的析构函数。

但是,我第一次尝试创建 DOC 结构时,出现以下错误:

QueryProcessor.exe 中 0x7c812afb 处的未处理异常:Microsoft C++ 异常:内存位置 0x0012f5dc.. 处的 std::bad_alloc

我不明白发生了什么——我是不是用了太多内存以至于堆满了?这似乎不太可能。而且我以前甚至都没有用过那个指针。

所以:首先,我在做什么导致了错误,其次,下面的代码会多次工作吗?我是否需要为每个创建的结构创建一个单独的指针,或者我是否可以重复使用相同的临时指针并假设队列将保留一个指向每个结构的指针?

这是我的代码:

struct DOC{
int docid;
double rank;

public:
DOC()
{
docid = 0;
rank = 0.0;
}

DOC(int num, double ranking)
{
docid = num;
rank = ranking;

}

bool operator>( const DOC & d ) const {
return rank > d.rank;
}

bool operator<( const DOC & d ) const {
return rank < d.rank;
}
};


//a lot of processing goes on here

priority_queue<DOC, std::vector<DOC>, std::greater<DOC>> q;

//when a matching document is found, I do this:

rank = calculateRanking(table, num);

//if the heap is not full, create a DOC struct with the docid and rank and add it to the heap
if(q.size() < 20)
{
doc = new DOC(num, rank);
q.push(*doc);
doc = NULL;
}

//if the heap is full, but the new rank is greater than the
//smallest element in the min heap, remove the current smallest element
//and add the new one to the heap
else if(rank > q.top().rank)
{
q.pop();

cout << "pushing doc on to queue" << endl;
doc = new DOC(num, rank);
q.push(*doc);
}

非常感谢,bsg。

最佳答案

为什么要在堆上创建以下结构:

doc = new DOC(num, rank);
q.push(*doc);

这首先在堆上创建一个DOC,然后将对象的拷贝存储在队列中,随后泄漏动态创建的DOC

以下内容就足够了,不会泄漏:

q.push(DOC(num, rank));

关于c++ - 将 new 用于结构 C++ 时出现 Bad_alloc 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com