在c++中分配和释放内存

allocate and deallocate memory in c++

本文关键字:释放 内存 分配 c++      更新时间:2023-10-16

我正试图弄清楚为什么这段代码不能正常工作。我想为一个超过250000个单词的词典文件分配内存。内存分配工作正常。但是可用内存不正常。老实说,我不知道为什么。它在解除分配时中断。下面是代码。非常感谢。

    #include <iostream>   // For general IO
    #include <fstream>    // For file input and output
    #include <cassert>    // For the assert statement
    using namespace std;
    const int NumberOfWords = 500000;   // Number of dictionary words
                 //if i change to == to exact number of words also doesnt work 
    const int WordLength = 17;      // Max word size + 1 for null 
    void allocateArray(char ** & matrix){
         matrix = new char*[NumberOfWords];
         for (int i = 0; i < NumberOfWords; i++) {
             matrix[i] = new char[WordLength];
               // just to be safe, initialize C-string to all null characters 
               for (int j = 0; j < WordLength; j++) {
                    matrix[i][j] = NULL;
               }//end for (int j=0...
         }//end for (int i...
    }//end allocateArray()
    void deallocateArray(char ** & matrix){
          // Deallocate dynamically allocated space for the array
          for (int i = 0; i < NumberOfWords; i++) {
                delete[] matrix[i];
          }
          delete[] matrix; // delete the array at the outermost level
    }
    int main(){
    char ** dictionary;
    // allocate memory
    allocateArray(dictionary);
    // Now read the words from the dictionary
    ifstream inStream;  // declare an input stream for my use
    int wordRow = 0;    // Row for the current word
    inStream.open("dictionary.txt");
    assert(!inStream.fail());  // make sure file open was OK
    // Keep repeating while input from the file yields a word
    while (inStream >> dictionary[wordRow]) {
        wordRow++;
    }
    cout << wordRow << " words were read in." << endl;
    cout << "Enter an array index number from which to display a word: ";
    long index;
    cin >> index;
    // Display the word at that memory address 
    cout << dictionary[index] << endl;
    deallocateArray(dictionary);
    return 0;
}

问题出现在以下行:

 while (inStream >> dictionary[wordRow]) {

输入行长度没有限制,应用程序至少覆盖一个字符串缓冲区。我会这样修复:

 while (inStream >> std::setw(WordLength - 1) >> dictionary[wordRow]) {

请不要忘记添加

 #include <iomanip>

带有setd::setw声明的