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