我正在尝试创建一个将从文件读取并计算三元组频率的类,但由于某种原因,我得到了这个双重释放或损坏错误,它会让我崩溃Visual Studio代码。
这是.cpp
frequency::frequency(std::ifstream &infile)
{
freqValue(infile);
}
std::vector<int> frequency::freqValue(std::ifstream &infile)
{
std::vector<int> freqs(17576);
char ch;
while(infile.get(ch))
{
ch = tolower(ch);
if(((ch -'a') >= 0 && (ch-'a') <= 26)) letters.push_back(ch);
}
int result = 0;
for(size_t i = 0; i < letters.size() - 2; i++)
{
result += ((int) (letters[i] - 'a') *676);
result += ((int)(letters[i + 1] - 'a') * 26);
result += ((int)(letters[i+2] - 'a'));
if (result == 17576) result -= 1;
freqs[result] += 1;
std::cout << freqs[result];
result = 0;
}
return freqs;
}
这是主要的
int main(int argc, char *argv[])
{
if(argc > 0)
{
std::ifstream infile;
infile.open(argv[0]);
frequency i(infile);
return 0;
}
}
和标题
class frequency
{
private:
std::vector<char> letters;
std::vector<int> frequencies;
public:
frequency(std::ifstream &infile);
std::vector<int> freqValue(std::ifstream &infile);
};
#endif
答案 0 :(得分:0)
我在你的程序中看到了2个问题。
首先:
for(size_t i = 0; i < letters.size() - 2; i++)
应改进此循环的条件:
for(size_t i = 0; i + 2 < letters.size(); i++)
由于i
和letters.size()
都是无符号的,大小为1或0会给出下溢和超出限制的访问权限。
第二个问题我们不知道您的数据集,但我不明白为什么result
不能超过17576
(例如letters
中的26&#39; z&#39;会这样做)所以你至少应该检查并报告诊断。如果您不希望在发布模式下进行检查,则可以使用assert执行此操作。
答案 1 :(得分:0)
我找到了解决方案,结果检查的数学,我已经检查了很多次,但问题是
if(((ch -'a') >= 0 && (ch-'a') <= 26)) letters.push_back(ch);
这应该是25而不是26,否则它将取得一个高于Z的ascii值,这将允许它超过17576产生错误。感谢您的所有意见,我感谢您的帮助