双重免费或损坏错误(找不到错误?)

时间:2018-04-11 15:27:17

标签: c++ c++11

我正在尝试创建一个将从文件读取并计算三元组频率的类,但由于某种原因,我得到了这个双重释放或损坏错误,它会让我崩溃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

2 个答案:

答案 0 :(得分:0)

我在你的程序中看到了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&#39; z&#39;会这样做)所以你至少应该检查并报告诊断。如果您不希望在发布模式下进行检查,则可以使用assert执行此操作。

答案 1 :(得分:0)

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

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

这应该是25而不是26,否则它将取得一个高于Z的ascii值,这将允许它超过17576产生错误。感谢您的所有意见,我感谢您的帮助