【发布时间】: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,您将越界 -
我的编译器还是崩溃了。 -- 你的编译器没有问题。您的程序有错误,并且由于这些错误,您的程序会崩溃。是时候学习如何使用调试器了。