双重释放或损坏错误(找不到错误?

double free or corruption error (Can't find error?)

本文关键字:错误 找不到 损坏 释放      更新时间:2023-10-16

我正在尝试创建一个类,该类将从文件中读取并计算三元组的频率,但由于某种原因,我得到了这个双重释放或损坏错误,它使Visual Studio Code崩溃。

这是.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

我在您的程序中看到了 2 个问题。

第一:

 for(size_t i = 0; i < letters.size() - 2; i++)

应改进此循环的条件:

 for(size_t i = 0; i + 2 < letters.size(); i++)

由于 iletters.size() 都是无符号的,因此大小为 1 或 0 将提供下溢和越界访问权限。

第二个问题我们不知道您的数据集,但我不明白为什么result不能大于17576(例如letters中的 26 "z"会成功(,因此您至少应该检查一下并报告诊断。如果您不希望在发布模式下进行检查,则可以使用 assert 执行此操作。

我找到了解决方案,结果检查的数学,我已经检查了很多次,但问题是

if(((ch -'a') >= 0 && (ch-'a') <= 26)) letters.push_back(ch); 

它应该是 25 而不是 26,否则它将使 ASCII 值也高于 Z,这将允许它超过 17576 出错。感谢您的所有投入,感谢您的帮助