2013-10-27 3 views
1

я выделил некоторую память (Word * wordList) для этой структуры:Почему происходит дезактивация памяти при сбое?

struct Word{ 
      int occurrences; 
      std::string wrd; 
    }; 

написав:

 Word * tempList = new Word[numWords + 1]; 
      for(int i = 0; i < numWords; i++){ 
       tempList[i] = wordList[i]; 
      } 
      delete[] wordList; 
      wordList = tempList; 
      tempList = 0; 
      Word currWord = {1, wrd}; 
      wordList[numWords] = currWord; 
      numWords++; 

numWords является размером WordList до и после того, как этот бит кода вызывается и wrd является строкой перешел в метод. Этот код запускается, чтобы добавить слово, если оно еще не присутствует в wordList.

Моя проблема заключается в том, что, когда вызывается delete[], программа перестает работать. Я попытался использовать delete, чтобы узнать, что произойдет, и программа работала нормально, насколько я мог судить. Что происходит и почему delete[] заставляет мою программу замерзать?

wordList является членом class WordsOfLength:

class WordsOfLength{ 
    private: 
     int numWords; 
     Word * wordList; 

    public: 
     WordsOfLength(); 
     WordsOfLength(int nNumWords, Word* nWordList); 
     ~WordsOfLength(); 
     void addWord(std::string wrd); 
     std::string getWord(int frequency); 
     friend void WordData::writeWordData(const char* fileName); 
     friend void WordData::setWordData(const char* fileName); 
    }; 

с конструктором:

WordsOfLength::WordsOfLength(){ 
     numWords = 0; 
     wordList = NULL; 
    } 

и деструктор:

WordsOfLength::~WordsOfLength(){ 
     delete[] wordList; 
     wordList = 0; 
    } 
+1

Код является частью более крупного класса, где 'wordList' является участником, не так ли? Можете ли вы показать все конструкторы и деструктор? –

+0

Либо 'wordList' должен указывать на * valid * предыдущее распределение массива, либо должен быть' nullptr'. Все остальное - неопределенное поведение **. – WhozCraig

+0

звучит так, будто вы случайно пишете больше, чем вам где-то разрешено, поэтому нам нужно немного больше контекста, чтобы понять, что не так –

ответ

0

Если вы не выделили wordList где-нибудь до проблемной линии, то вы пытаетесь d ealocate unallocated memory.

+0

Я установил 'wordList' в' NULL', когда объект был создан. Программа проходит через этот бит кода несколько раз с нулевыми элементами в этом бите памяти и одним элементом в этом бите памяти без видимой проблемы. – user2925882

+0

Примечание: 'nullptr' является допустимым значением для передачи' delete' и 'delete []', эффективно становясь no-op. Тем не менее, * неопределенное * значение в 'wordList', такое как неспособность правильно инициализировать' nullptr' или висячий указатель, действительно является неопределенным поведением. – WhozCraig

+0

@ user2925882 - это объекты класса, которые * содержат * этот указатель, когда-либо скопированный каким-либо образом (включая pass-by-value как параметр функции), и если да, правильно ли вы выполняли оператор-конструктор и оператор присваивания? Я предполагаю, что вы правильно очищаете участника в своем классе * деструктор *. Обновите свой вопрос и опубликуйте определение класса, содержащее этот элемент 'wordList', включая все объявления функций-членов, конструкторы и т. Д. – WhozCraig

Смежные вопросы