Цитата(Ukrajinec @ 14.1.2015, 19:35 ) | | здесь программа прерывается |
И правильно делает. Ведь Вы создаёте одномерный(!) массив, а указатель на него кладете по адресу *cl_, при этом сам cl_ никак не инициализирован (то есть cl_ мусорное, следовательно, *cl_ указывает неизвестно куда, может и в защищенную область памяти процесса).
Как я понял, Вам нужен именно двумерный массив и именно типа char**, так? В таком случае сначала нужно запросить память на массив указателей:и не забыть его инициализировать:| Код | for( int i = 0; i < a; i++) cl_[i] = 0; |
(NULL'ом в C++ лучше не пользоваться). В дальнейшем строчку Вы можете добавить таким образом:| Код | bool List::add(const char *s, int i) { if( i < 0 || i >= n_ ) return false; if( cl_[i] != 0 ) delete [] cl_[i]; if( s == 0 ) return true;
int length = stlen(s); cl_[i] = new char[length+1]; for( j = 0; j < length; j++) cl_[i][j] = s[j]; // или strcpy cl[i][length] = '\0'; return true; }
|
Деструктор:| Код | List::~List() { for( i = 0; i < n_; i++) if( cl_[i] != 0 ) delete [] cl_[i]; delete [] cl_; cl_ = 0; n_ = 0; }
|
Цитата(Ukrajinec @ 14.1.2015, 19:35 ) | *(cl_ + i) = new char[len]; *(cl_ + i) = &a; |
Что Вы здесь пытаетест скопировать? Сначала Вы задали значение для *(cl_ + i) как new char[len] (причем на завершающий ноль память не выделена), затем это самое значение перезаписываете величиной &a. Итог: строка не скопирована (скопирован адрес строки, но не сама строка), плюс утечка памяти.
Цитата(Ukrajinec @ 14.1.2015, 19:35 ) | List::List() // по-умолчанию создается 1 элемент массива, длиной в 1 символ { n_ = 0; *cl_ = new char; } |
В чем смысл устанавливать n_ в ноль, но при этом запрашивать память? |