Форум программистов, компьютерный форум CyberForum.ru

Очистка памяти - ошибка - C++

Восстановить пароль Регистрация
 
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
11.04.2013, 23:34     Очистка памяти - ошибка #1
Здравствуйте, друзья.
Подскажите, пожалуйста, где ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main()
{   
    int size = 5;
    int **array = new int*[size]; 
 
    for (int i = 0; i < size; i++)
    {
        array[i] = new int[size];
        for (int j = 0; j < size; j++)
            *((int*)*array + (size * i) + j) = 0;
    }
 
    for (int i = 0; i < size; i++)
        delete [] array[i];
 
    delete [] array;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 23:34     Очистка памяти - ошибка
Посмотрите здесь:

C++ Очистка памяти
C++ Очистка памяти массива (С++)
C++ Очистка памяти
C++ Очистка памяти
C++ Очистка памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
11.04.2013, 23:41     Очистка памяти - ошибка #2
C++
1
array[i][j] = 0;
Вместо вот того вот...в цикле.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:42     Очистка памяти - ошибка #3
OdessaNA, напишите,вместо
C++
1
*((int*)*array + (size * i) + j) = 0;
просто
C++
1
array[i][j] = 0;
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
11.04.2013, 23:52  [ТС]     Очистка памяти - ошибка #4
Как я понимаю - адресная арифметика положительно сказывается на быстродействии программы.
Вот этот код работает без ошибок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Size = 5;
 
    int *array = new int[Size];
 
    for (int i = 0; i < Size; i++)
    {
        *(array + i) = 0;
        printf("%d ", *(array + i));
    }
 
    delete [] array;
 
    printf("\n");
Добавлено через 2 минуты
C++
1
*((int*)*array + (size * i) + j) = 0;
в этой строчке, как я понимаю - двигаемся от адреса нулевого эл-та массива, и в нужную ячейку записываем значение. Но вот как оно сказывается на выделении-освобождении памяти???
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
11.04.2013, 23:54     Очистка памяти - ошибка #5
Цитата Сообщение от OdessaNA Посмотреть сообщение
ак я понимаю - адресная арифметика положительно сказывается на быстродействии программы.
никак она не сказывается
это две записи одного и того же
а накосячить в адресной можно на раз
тем более что современные оптимизаторы оптимизируют код лучше чем ты
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:57     Очистка памяти - ошибка #6
OdessaNA, кроме всего прочего, ты уверен,что оно выделит тебе память линейно, а не одну строку в одном месте,а следующую через 100 байт?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
12.04.2013, 00:00     Очистка памяти - ошибка #7
Цитата Сообщение от OdessaNA Посмотреть сообщение
в этой строчке, как я понимаю - двигаемся от адреса нулевого эл-та массива, и в нужную ячейку записываем значение.
нет
у тебя не двойной массив а массив указателей на массивы
это значит что в памяти они могут рядом не лежать
чтобы тебе эмулировать эту запись
C++
1
arr[i][j]=0;
тебе нужно записать примерно так
C++
1
2
int * arr1=*(arr+i);// берем указатель на i тый массив
*(arr1+j)=0;//записываем в jтую ячейку 0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 00:04     Очистка памяти - ошибка
Еще ссылки по теме:

C++ Очистка памяти delete[];
очистка памяти C++
C++ Ссылки и очистка памяти

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OdessaNA
 Аватар для OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 240
12.04.2013, 00:04  [ТС]     Очистка памяти - ошибка #8
Цитата Сообщение от metaluga145 Посмотреть сообщение
OdessaNA, кроме всего прочего, ты уверен,что оно выделит тебе память линейно, а не одну строку в одном месте,а следующую через 100 байт?
...ну да. В куче выделение памяти не обязательно "одним куском". Вот и ответ на мой вопрос.
Подобная форма записи подходит для статических массивов.

Всем спасибо.
Yandex
Объявления
12.04.2013, 00:04     Очистка памяти - ошибка
Ответ Создать тему
Опции темы

Текущее время: 00:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru