2016-11-09 3 views
0

У меня проблема с 2D динамическим массивом. Код находится здесь:Удаление динамического массива 2D не будет работать

//Inicialization 
char** arr = new char* [size]; 
for(int i = 0; i < size; i++) 
    arr[i] = new char[70]; 

Общее количество предложений с max 70 символов каждый. Хорошо ... Я использовал это раньше. Тогда я хочу обсудить это - я тоже это сделал!

//Deleting 
for(int i = 0; i < size; i++) 
    delete [] arr[i]; 
delete [] arr; 

И это будет врезаться прямо в г = 0 с: "Выражение: _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse)".

Но, как я сказал, - я использовал его в другом проекте, таким образом:

//Init 
char** vety = new char* [pocVet]; 
for(int i = 0; i < pocVet; i++) 
    vety[i] = new char[100]; 
//Something (again a few sentences). 
//Deleting 
for(int i = 0; i < pocVet; i++) 
    delete [] vety[i]; 
delete [] vety; 

Я смотрел везде здесь, и это то же самое. Что не так? PS: Во втором примере, где он работает, не возражайте против разных имен (на моем родном языке).

Редактировать: Возможно, это из-за содержимого массива? Но во втором случае (где он работает) есть предложения в нем. Просто у меня куча вопросов в нем, и пользователь только выбрать действие - так поясню это только предложения:

arr[0] = " 1 - Use something\n"; 
arr[1] = " 2 - Use different thing\n"; 
arr[2] = " 3 - etc...\n"; 
arr[3] = " 4 - etc\n"; 
arr[4] = " 5 - etc\n"; 
arr[5] = " 6 - etc\n"; 
arr[6] = " 7 - etc\n"; 

Я ничего не делаю с ним ... только Е();

+3

Проблема заключается с тем, как использовать новый массив. Потому что [что вы опубликовали работает] (http://ideone.com/L3tg7j) – StoryTeller

+2

вероятность того, что вы топаете на указатели массива где-то между распределением и последующим удалением – Alnitak

+4

Действительно. Я только что запустил ваш исходный код на 2 компиляторах. Нет проблем. ... требуется [mcve]. –

ответ

4

Вы переназначаете указатель arr[0], чтобы указать на строковый литерал.

arr[0] = " 1 - Use something\n"; 

Таким образом, вы утечка памяти, вы выделенная, а затем вы пытаетесь вызвать delete[] на памяти вы не выделяли.

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

std::vector<std::string> v; 
v.emplace_back(" 1 - Use something\n"); 
// Other sentences 
1

sprintf должны работать для вас до тех пор, как строковый литерал имеет размер меньше, чем 70.

sprintf(arr[0], " 1 - Use something\n"); 
Смежные вопросы