C++ 我是否删除错误?
所以在课堂上,我们必须创建一个代码,从文件中获取单词,忽略标点符号并打印出单词。不仅如此,它还必须忽略同一单词的副本,还要跟踪哪些单词重复,并将其计数添加到并行数组中。但在程序即将结束时,我不断发生崩溃,我是否删除错误C++ 我是否删除错误?,c++,arrays,dynamic,C++,Arrays,Dynamic,所以在课堂上,我们必须创建一个代码,从文件中获取单词,忽略标点符号并打印出单词。不仅如此,它还必须忽略同一单词的副本,还要跟踪哪些单词重复,并将其计数添加到并行数组中。但在程序即将结束时,我不断发生崩溃,我是否删除错误 #include <fstream> #include <iostream> #include <cstring> using std::cout; using std::cin; using std::endl; using std::if
#include <fstream>
#include <iostream>
#include <cstring>
using std::cout;
using std::cin;
using std::endl;
using std::ifstream;
int GetCount(char filename[50]);
int main()
{
char filename[50] = "b.txt";
int choice = 0;
cout << "Input the file name: ";
//cin >> filename;
int numberOfWords = GetCount(filename);
cout << endl << numberOfWords << endl;
ifstream fileRead;
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
fileRead.open(filename);
if (!fileRead.is_open())
{
std::cerr << "\n Error opening file\n";
}
else
{
//Buffers to get words from file
char buffer[1000];
char bufferBuffer[1000];
每个
新
必须与delete
配对。让我们检查一下,好吗
char ** cStringArray = new char *[numberOfWords];
配对
delete [] cStringArray;
棒极了
*cStringArray = new char[strlen(buffer) + 1];
配对
delete[] cStringArray[i];
一切看起来都很好
除了
让我们更详细地了解一下最后一个问题
for (int i = 0; i < indexOfWord + 1; i++)
{
cStringArray[i] = nullptr;
delete[] cStringArray[i];
}
for(int i=0;i
嗯。将指针设置为nullptr
。删除nullptr
。程序在删除之前丢失了指针并泄漏了内存
如果仔细观察,周围的噪音少一些,就不太好了
注意,这只是查看删除。代码中可能还有其他问题,我没有看过。乍一看,这似乎过于复杂。这就是为什么它如此有用的原因。如果你把所有不必要的东西都删掉,错误会更明显。每一个
新
都必须与删除
配对。让我们检查一下,好吗
char ** cStringArray = new char *[numberOfWords];
配对
delete [] cStringArray;
棒极了
*cStringArray = new char[strlen(buffer) + 1];
配对
delete[] cStringArray[i];
一切看起来都很好
除了
让我们更详细地了解一下最后一个问题
for (int i = 0; i < indexOfWord + 1; i++)
{
cStringArray[i] = nullptr;
delete[] cStringArray[i];
}
for(int i=0;i
嗯。将指针设置为nullptr
。删除nullptr
。程序在删除之前丢失了指针并泄漏了内存
如果仔细观察,周围的噪音少一些,就不太好了
注意,这只是查看删除。代码中可能还有其他问题,我没有看过。乍一看,这似乎过于复杂。这就是为什么它如此有用的原因。如果你把所有不必要的东西都删掉,错误会更明显。你为什么不使用
std::string
和std::vector
?假设你删除得不正确,最好的方法就是放弃指针和数组的使用,以及你所拥有的东西,通过使用<代码> STD::String 和std::vector
、std::string
和std::map
?有STL算法吗?如果不是,这就像学习开车,但首先你必须用石头建造方轮。完全是unnecessary@MarkRansom通过重新编码字符串、向量或矩阵类来学习力学是一回事。但是在这种情况下使用原始指针,那是胡说八道。@MarkRansom我同意应该教它,但现在不是使用这些概念的正确时机。在最好的情况下,这会让学生养成必须改掉的坏习惯(使用裸体new
和delete
,不封装,忽略现有的工作工具),或者在最坏的情况下,这会让学生感到困惑,并将他们永远吓跑。没有人应该为这项任务专业地编写这种代码,那么我们为什么要鼓励学生这样做呢?(重申:了解低级概念很重要,我一直在专业地使用它们,但从来不会用于此类任务)为什么不使用std::string
和std::vector
?假设删除错误,最好的方法就是放弃指针和数组的使用,以及你所拥有的,通过使用<代码> STD::String 和std::vector
、std::string
和std::map
?有STL算法吗?如果不是,这就像学习开车,但首先你必须用石头建造方轮。完全是unnecessary@MarkRansom通过重新编码字符串、向量或矩阵类来学习力学是一回事。但是在这种情况下使用原始指针,那是胡说八道。@MarkRansom我同意应该教它,但现在不是使用这些概念的正确时机。在最好的情况下,这会让学生养成必须改掉的坏习惯(使用裸体new
和delete
,不封装,忽略现有的工作工具),或者在最坏的情况下,这会让学生感到困惑,并将他们永远吓跑。没有人应该为这项任务专业地编写这种代码,那么我们为什么要鼓励学生这样做呢?(重申:了解低级概念很重要,我一直在专业地使用它们,但从未用于此类任务)