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

时间:2016-11-09 04:50:45

标签: c++

我试图弄清楚为什么这段代码不能正常工作。我想为超过250,000个单词的字典文件分配内存。内存分配正常。但是,免费记忆并不存在。老实说,我不知道为什么。它在解除分配期间中断。下面是代码。 谢谢。

    #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;
}

1 个答案:

答案 0 :(得分:1)

问题出在以下几行:

 while (inStream >> dictionary[wordRow]) {

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

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

请不要忘记添加

 #include <iomanip>

setd::setw声明