2014-01-14 2 views
0

Я разрабатываю программу, в которой одной из задач является чтение точек (x, y и z) из текстового файла, а затем их сохранение в массиве. Теперь текстовый файл может содержать 10^2 или даже 10^6 баллов, в зависимости от выбранного пользователем текстового файла. Поэтому я определяю динамический массив.Ошибка: освобождение 2D-массива

Для выделения динамического 2D массива, я написал, как показано ниже, и она отлично работает:

const int array_size = 100000; 
float** array = new float* [array_size]; 
for(int i = 0; i < array_size; ++i){ 
    ary[i] = new float[2]; // 0,1,2 being the columns for x,y,z co-ordinates 
} 

После того, как точки сохраняются в массиве, я пишу следующее для освобождения нераспределенной памяти:

for (int i = 0; i < array_size; i++){ 
    delete [] array[i]; 
} 

delete [] array; 

, а затем моя программа перестает работать и показывает, что «Project.exe перестает работать».

Если я не освобожу, программа работает нормально.

+0

У вас есть веская причина не использовать 'std :: array' или' std :: vector'? – shuttle87

+1

На том же самом примечании, почему бы просто не сделать массив 'struct', содержащий 3 поплавки? – TheBuzzSaw

+2

У вас есть опечатка' ary [i] = new float [2]; 'ary => array – inkooboo

ответ

2

В вашем комментарии вы скажете 0,1,2 being the columns for x,y,z co-ordinates, если это так, вам необходимо выделить float[3]. Когда вы выделяете массив из float[N], вы выделяете кусок памяти размером N * sizeof(float), и вы будете индексировать их в массиве от 1 до N - 1. Поэтому, если вам нужны индексы 0,1,2, вам необходимо будет выделить память размером 3 * sizeof(float), что делает ее float[3].

Потому что кроме этого я могу скомпилировать и запустить код без ошибок. Если вы исправите и по-прежнему получите сообщение об ошибке, это может быть проблемой вашего компилятора. Затем попробуйте уменьшить 100000 до небольшого числа и повторите попытку.

+1

Не думайте, что компилятор может быть проблемой здесь. – user2672165

+0

Я согласен с тем, что в таком случае вы можете положиться на компилятор, но я подозревал, что компилятор здесь Turbo C: D – adrin

+0

@adrin Я использую Dev C++ в качестве IDE, а используемым компилятором является TDM-GCC 4.7.1. – deepak09027

1

Вы говорите, что пытаетесь реализовать динамический массив, это то, что делает std::vector, и я настоятельно рекомендую вам его использовать. Таким образом, вы используете что-то из стандартной библиотеки, которая очень хорошо протестирована, и вы не столкнетесь с проблемами, по существу, пытаясь перевернуть свою собственную версию std::vector. Кроме того, этот подход улучшает память, поскольку использует RAII, который использует язык для решения многих проблем управления памятью. Это имеет и другие преимущества, как сделать код более безопасным.

Также, если вы храните координаты x, y, z, рассматривайте использование структуры или кортежа, я думаю, что это значительно повышает удобочитаемость. Вы также можете ввести тип координаты. Что-то вроде std::vector<coord_t> более читаемо для меня.

+0

Но я где-то читал, что для увеличения размера вектора значения сдвигаются по обратной стороне вектора, и для этого требуется дополнительная обработка. – deepak09027

+0

Если вы заранее знаете, сколько элементов находится в массиве, вы можете использовать функцию 'std :: vector' 'reserve', чтобы предварительно выделить размер. Если вам нужен динамический массив, вы обнаружите, что всегда будет накладные расходы для изменения размера массива, что просто является неотъемлемой частью проблемы. Если массив всегда будет того же размера, вы можете использовать 'std :: array'. – shuttle87

-1

Для нескольких массивов я рекомендовал использовать boost::multi_array. Пример:

typedef boost::multi_array<double, 3> array_type; 
array_type A(boost::extents[3][4][2]); 
A[0][0][0] = 3.14; 
0

(Thanx много для предложений !!)

Наконец я использую векторы для поставленной задачи по причинам, как показано ниже:

1.Unlike Массивы (не массив объектов конечно), Мне не нужно вручную освобождать нераспределенную память.

2.Есть множество встроенных методов, определенных в соответствии с вектором класса

  1. Вектор размер может быть продлен на более поздних стадиях

Ниже, как я использовал 2D вектор для хранения точек (х, у, г координаты)

инициализирован (выделенная память) 2D-вектор:

  vector<vector<float>> array (1000, vector<float> array (3)); 

Где 1000 это количество строк, а 3 это количество столбцов

После объявления, значения могут быть переданы просто как:

     array[i][j] = some value; 

Кроме того, на более позднем этапе я объявил функции, принимающие векторные аргументы и возвращающие векторы, как:

  vector <vector <float>> function_name (vector <vector <float>>); 

    vector <vector <float>> function_name (vector <vector <float>> input_vector_name) 

    { 

    return output_vector_name_created_inside_function 

    } 

Примечание: Этот метод ящики копия вектора при возврате, используйте указатель для возврата по ссылке. Хотя мой не работает, когда я возвращаю вектор по ссылке :(

Смежные вопросы