Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否删除错误?_C++_Arrays_Dynamic - Fatal编程技术网

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 和这是C++,为什么人们仍然被教导为简单任务手动分配和释放内存。您是否已经学习过
std::vector
std::string
std::map
?有STL算法吗?如果不是,这就像学习开车,但首先你必须用石头建造方轮。完全是unnecessary@MarkRansom通过重新编码字符串、向量或矩阵类来学习力学是一回事。但是在这种情况下使用原始指针,那是胡说八道。@MarkRansom我同意应该教它,但现在不是使用这些概念的正确时机。在最好的情况下,这会让学生养成必须改掉的坏习惯(使用裸体
new
delete
,不封装,忽略现有的工作工具),或者在最坏的情况下,这会让学生感到困惑,并将他们永远吓跑。没有人应该为这项任务专业地编写这种代码,那么我们为什么要鼓励学生这样做呢?(重申:了解低级概念很重要,我一直在专业地使用它们,但从来不会用于此类任务)为什么不使用
std::string
std::vector
?假设删除错误,最好的方法就是放弃指针和数组的使用,以及你所拥有的,通过使用<代码> STD::String 和这是C++,为什么人们仍然被教导为简单任务手动分配和释放内存。您是否已经学习过
std::vector
std::string
std::map
?有STL算法吗?如果不是,这就像学习开车,但首先你必须用石头建造方轮。完全是unnecessary@MarkRansom通过重新编码字符串、向量或矩阵类来学习力学是一回事。但是在这种情况下使用原始指针,那是胡说八道。@MarkRansom我同意应该教它,但现在不是使用这些概念的正确时机。在最好的情况下,这会让学生养成必须改掉的坏习惯(使用裸体
new
delete
,不封装,忽略现有的工作工具),或者在最坏的情况下,这会让学生感到困惑,并将他们永远吓跑。没有人应该为这项任务专业地编写这种代码,那么我们为什么要鼓励学生这样做呢?(重申:了解低级概念很重要,我一直在专业地使用它们,但从未用于此类任务)