【问题标题】:double free or corruption error (Can't find error?)双重免费或损坏错误(找不到错误?)
【发布时间】:2018-04-11 15:27: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

【问题讨论】:

  • 为什么是双倍行距?
  • 你应该确保result永远不会大于或等于17576
  • 这还不够if (result == 17576) result -= 1;
  • 请注意,如果letters.size() 为 0 或 1,您将越界
  • 我的编译器还是崩溃了。 -- 你的编译器没有问题。您的程序有错误,并且由于这些错误,您的程序会崩溃。是时候学习如何使用调试器了。

标签: c++ c++11


【解决方案1】:

我在您的程序中发现了 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 来执行此操作。

【讨论】:

    【解决方案2】:

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

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

    这应该是 25 而不是 26,否则它会将 ascii 值取为 Z 之上的 1,这将允许它超过 17576 并产生错误。感谢您的所有意见,我感谢您的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 2017-11-18
      • 2019-07-09
      相关资源
      最近更新 更多