Я хорошо знаю, что таких проблем бесчисленное множество, но я искал часами и не мог понять, что я сделал не так, поэтому я был бы очень признателен за вашу помощь. (я новичок в программировании)
Мне нужно создать своего рода менеджер словарей как часть моей домашней работы, но у меня, похоже, проблема с удалением слов. Я получаю сообщение об ошибке "... сработала точка останова".
Обычный ответ, который люди получают на эту проблему, заключается в том, что это повреждение кучи, вызванное выходом за пределы, но я не могу понять, вызвал ли я это и как.
Я уже сделал что-то подобное с управлением информацией о шине, и оно отлично работало, что еще больше меня запутало... (Очевидно, я не сделал механизм точно таким же, но даже посмотрев на мой предыдущий код, я не смог выделить проблема)
Я добавил функции, которые, по моему мнению, вызывают беспокойство,
Функция добавления:
void Add_Word(char**& dictionary, int& dictionary_size, char word[])
{
char** temp = new char*[dictionary_size + 1]; // Create a new array of appropriate size.
int i;
for (i = 0; i < dictionary_size; i++)
{
temp[i] = dictionary[i]; // Copy head pointers addresses for all existing items.
}
temp[i] = new char[strlen(word)]; // Add the space for the new word,
temp[i][strlen(word)] = '\0'; // mark its end
strcpy_s(temp[i], strlen(word) + 1, word); // then copy it.
// I'm really not so sure about what I should put in the buffer length but
// strlen(word) + 1 seemed to work... I know... not good, but strlen(word) alone caused a problem.
if (dictionary_size > 0)
delete []dictionary; // Delete previous head pointers array if there are any and
dictionary = temp; // reset the main pointer to the address of the new one.
dictionary_size++; // Finally, increase dictionary_size.
}
Функция удаления:
void Delete_Word(char**& dictionary, int& dictionary_size, char* word)
{
// !!! This is where the crash thingy happens.
delete[] Search_For_Word(dictionary, dictionary_size, word); // Delete the word from the dictionary.
// Search_For_Word returns a pointer to the word it receives, from the dictionary.
char** temp = new char*[dictionary_size - 1]; // Create a new array of appropriate size.
int i;
for (i = 0; i < dictionary_size; i++)
{
if (dictionary[i][0])
temp[i] = dictionary[i]; // Copy the head pointers of the existing
// items to the new array except for the deleted word.
}
delete[] dictionary; // Delete previous head pointers array and
dictionary = temp; // reset the main pointer to the address of the new one.
dictionary_size--; // Finally, decrease dictionary_size.
}
РЕДАКТИРОВАТЬ: Любые части, которые чрезмерно неэффективны или явно сломаны, вероятно, являются результатом того, что я возился с моим кодом, пытаясь понять это самостоятельно (например, 3 раза упомянутый вызов strlen (еще раз спасибо за это, kfsone...) , или забыл +1 для '\0', чтобы отметить конец строки - на самом деле, нет, если мы пойдем очевидным, вы не будете говорить мне о моих ошибках @.@).
Что касается причины, по которой я имею дело с char вместо строк и векторов, позвольте мне процитировать себя: "...как часть моей домашней работы". Я только начал программировать. Это, и я хочу понять основы, прежде чем перейти к использованию более удобных инструментов более высокого уровня.
char
указателями, чтобы реализовать это с помощью c++< /а>?? Используйте что-н. например,std::map<std::string,std::string>
, пожалуйста, и забудьте о правильном управлении памятью!! - person πάντα ῥεῖ   schedule 15.01.2014new
иdelete
, но то, что вы делаете, это C+ или C#-, а не C++. Я предполагаю, что вы облажались, выполняяdelete[] Search_For_Word ...
, но ваш код выглядит по-разному ошибочным (ошибки строки off-by-1 и т. д.), вы плохо понимаете указатели и c-строки, и вы не используете какие-либо фактические грани С++. Любое из следующих двух утверждений заменяет большую часть вашего кода, устраняет ошибки и значительно повышает эффективность.std::vector<std::string>
,std::vector<std::unique_ptr<std::string>>
. - person kfsone   schedule 15.01.2014temp[i] = new char[strlen(word)]; temp[i][strlen(word)] = '\0'; strcpy_s(temp[i], strlen(word) + 1, word);
УЖАСЕН. Он вызывает strlen 3 раза (дорого), передает strlen (плюс 1! в strcpy_s (глупо, глупо, глупо), добавляет '\0' перед strcpy (все виды неправильно), существует не так уж много способов, которыми вы могли быtemp[i] = strdup(word);
ошибиться еще больше.О... И индексы массива C/C++ основаны на нуле, поэтомуtemp[i][strlen(word)] = '0'
всегда записывает в один элемент после конца распределения. - person kfsone   schedule 15.01.2014