Исключение, возникающее при удалении памяти из кучи памяти

#c #exception #heap-memory

#c #исключение #кучная память

Вопрос:

Я получаю исключение, созданное для delete[] user; оператора в следующем коде. Код представляет собой систему меню, которая должна загружать данные в a vector , а затем распределять память в кучу. Пожалуйста, помогите.

 #include lt;fstreamgt; #include lt;iostreamgt; #include lt;crtdbg.hgt; #include lt;vectorgt; #include lt;stringgt; #include lt;sstreamgt; #include "Userboard.h"  using namespace std;  int main() {  const int M_USER = 6;  const int M_PASS = 7;  const int M_SCORE = 2;  int choice;  vectorlt;stringgt; player;  fstream file("pinfo.txt");  string line;  while (getline(file, line)) {  player.push_back(line);  }  const int NO_OF_PLAYERS = 20;  Userboard* stPlayer[NO_OF_PLAYERS] ;  string p;  string u;  char* key = new char[MAX_PASS];  char* user = new char[MAX_USER];  for (int i = 0; i lt; player.size(); i  ) {  int score;  u = player[i].substr(0, M_USER);   stringstream ss;  ss lt;lt; player[i].substr(20, M_SCORE);  ss gt;gt; score;  p = player[i].substr(10, M_PASS);  cout lt;lt; " " lt;lt; u lt;lt; score lt;lt; endl;   for (int a = 0; a lt; M_USER;a  ) {  user[a] = u[a];  }    for (int a = 0; a lt; M_PASS; a  ) {  key[a] = p[a];  }  }   do  {  cout lt;lt; "nn1) ExitnnChoose an option:";  cin gt;gt; choice;  switch (choice)  {  case 1:  for (int i = 0; i lt; player.size(); i  ) {  for (int a = 0; a lt; M_USER; a  ) {  delete[] user;  }  for (int a = 0; a lt; M_PASS; a  ) {  delete[] key;  }  }  return 0;  default:  };   } while (choice != 1); };  

Комментарии:

1. Вы дважды(трижды, вчетверо и т.д.) удаляете ресурс. Это запрещено.

2. Есть только один user , но ты звонишь delete[] user; много — много раз.

3. Я не понимаю, почему вам нужно выделять строку C в куче, когда вы также используете std::string . Скорее всего, это непонимание того, чего вы хотите, по сравнению с тем, что вы написали.

4. итак, «std::строка» также выделяется в память hep?

5. Рекомендуется избегать явного управления памятью. Вы можете использовать unique_ptr vector или string среди других.

Ответ №1:

Вы new[] делаете key это user только 1 раз, поэтому вы должны delete[] делать это только 1 раз, а не в цикле вообще.

 do {  cout lt;lt; "nn1) ExitnnChoose an option:";  cin gt;gt; choice;  switch (choice)  {  case 1:  delete[] user;  delete[] key;  return 0;  } } while (true);