Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试将元素从映射复制到兼容优先级队列时出现无效堆错误_C++_Priority Queue - Fatal编程技术网

C++ 尝试将元素从映射复制到兼容优先级队列时出现无效堆错误

C++ 尝试将元素从映射复制到兼容优先级队列时出现无效堆错误,c++,priority-queue,C++,Priority Queue,我的程序制作了一个字符频率图(我将其存储在一个映射中),我试图将该映射中的每个元素复制到一个优先级队列中,这样我就可以得到这些值的排序副本(我计划进一步使用Q,这就是为什么我不对映射进行排序),但每当我尝试复制这些值时,程序在前两到三次迭代中执行良好,第四次迭代失败,原因是出现了“无效堆”错误 我不确定如何从这里开始,所以我发布了相关类的代码 #include "srcFile.h" #include <string> #include <iostream> srcFi

我的程序制作了一个字符频率图(我将其存储在一个映射中),我试图将该映射中的每个元素复制到一个优先级队列中,这样我就可以得到这些值的排序副本(我计划进一步使用Q,这就是为什么我不对映射进行排序),但每当我尝试复制这些值时,程序在前两到三次迭代中执行良好,第四次迭代失败,原因是出现了“无效堆”错误

我不确定如何从这里开始,所以我发布了相关类的代码

#include "srcFile.h"
#include <string>
#include <iostream>

srcFile::srcFile(std::string s_flName)
{
    // Storing the file name
    s_fileName= s_flName;
}

srcFile::srcFile()
{
    // Default constructor (never to be used)
}

srcFile::~srcFile(void)
{
}

void srcFile::dispOverallMap ()
{
    std::map<char,int>::iterator dispIterator;
dispIterator = map_charFreqDistribution.begin();
charElement *currentChar;

std::cout<<"\n Frequency distribution map \n";
while(dispIterator != map_charFreqDistribution.end())
{
    std::cout<< "Character : " << (int)dispIterator->first << " Frequency : "<< dispIterator->second<<'\n';
    currentChar = new charElement(dispIterator->first,dispIterator->second);

    Q_freqDistribution.push(*currentChar);
    dispIterator++;

    // delete currentChar;
}

while(!Q_freqDistribution.empty())
{
    std::cout<<'\n'<<"Queue Element : " << (int)Q_freqDistribution.top().ch_elementChar << " Frequency : " << Q_freqDistribution.top().i_frequency;
    Q_freqDistribution.pop();
}
}
#包括“srcFile.h”
#包括
#包括
srcFile::srcFile(std::string s_flName)
{
//存储文件名
s_fileName=s_flName;
}
srcFile::srcFile()
{
//默认构造函数(从不使用)
}
srcFile::~srcFile(无效)
{
}
void srcFile::dispOverallMap()
{
std::map::迭代器dispaterator;
dispIterator=map_charFreqDistribution.begin();
charElement*currentChar;
标准::cout

在上面的代码中,您创建了一个新的
charElement
对象,然后推送它,然后删除它。当您调用delete时,该对象不再存在——甚至不在队列中。这可能不是您想要的。您的向量正在重新分配指针并使其无效。您需要使用不同的数据结构,或者在向量,而不是原始指针。将元素插入向量时,指向内容的指针将无效

while(dispIterator != map_charFreqDistribution.end())
{
    std::cout<< "Character : " << (int)dispIterator->first << " Frequency : "<< dispIterator->second<<'\n';
    currentChar = new charElement(dispIterator->first,dispIterator->second);

    Q_freqDistribution.push(*currentChar);
    dispIterator++;

    delete currentChar;
}
while(dispaterator!=map\u charFreqDistribution.end())
{

std::coutHow定义了类型
charElement
Q\u frequencdistribution
?创建一个新的
currentChar
,然后传入对象本身而不是其指针,最后删除
currentChar
,看起来像是一个可疑的序列。如果您从未打算使用默认构造函数,则无需定义第一,只需使用显式构造函数。@eran我在主要问题中添加了定义。new->add->delete似乎是JAVA hangover(我在工作中使用的语言),但本质上我需要在每次迭代中创建一个新对象并添加到队列中。(键入此内容时产生了一个脑波,我是否应该删除变量,因为它在队列中作为引用保存)@JaredFriese感谢您的提示,这是一个粗略的代码草稿,该方法是在早期草稿中添加为存根的,该注释是为了提醒我在完成后将其删除。如果我在推送后不再删除对象(我在早期的代码草稿中也没有这样做),它仍然会给我相同的错误。
// The map which holds the frequency distribution of all characters in the file
    std::map<char,int> map_charFreqDistribution;
    void dispOverallMap();

// Create Q which holds character elements
std::priority_queue<charElement,std::vector<charElement>,compareCharElt>                 Q_freqDistribution;
currentChar = new charElement(dispIterator->first,dispIterator->second);

Q_freqDistribution.push(*currentChar);
dispIterator++;

delete currentChar;
while(dispIterator != map_charFreqDistribution.end())
{
    std::cout<< "Character : " << (int)dispIterator->first << " Frequency : "<< dispIterator->second<<'\n';
    currentChar = new charElement(dispIterator->first,dispIterator->second);

    Q_freqDistribution.push(*currentChar);
    dispIterator++;

    delete currentChar;
}