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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
#1

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

11.04.2013, 23:34. Просмотров 443. Ответов 7
Метки нет (Все метки)

Здравствуйте, друзья.
Подскажите, пожалуйста, где ошибка:
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++
Возник интересный вопрос... class Test { int a; }; class Test1 : public Test { int b, c; }; int main() { Test1 *t = new Test1; ...

Правильная очистка памяти - C++
Пытаюсь разобратся с работой с памятью в с++. Есть класс BigInteger содержащий в себе массив чисел int *arr. В конструкторе этот массив...

Очистка памяти массива (С++) - C++
Не получается очистить память массива. По моему коду, по завершении программы выдаётся ошибка &quot;попытка очистки памяти после записи её в...

указатели и очистка памяти - C++
В отличии от java в с++ память по умолчанию нужно очищать самостоятельно. Понятно, что если память зарезервированная неким указателем...

Очистка памяти delete[]; - C++
Есть функция ввида: void loltest(int md3) { char* randChars; int cCount; if(md3 &lt;= 0) cCount = 13; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 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
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
11.04.2013, 23:54     Очистка памяти - ошибка #5
Цитата Сообщение от OdessaNA Посмотреть сообщение
ак я понимаю - адресная арифметика положительно сказывается на быстродействии программы.
никак она не сказывается
это две записи одного и того же
а накосячить в адресной можно на раз
тем более что современные оптимизаторы оптимизируют код лучше чем ты
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:57     Очистка памяти - ошибка #6
OdessaNA, кроме всего прочего, ты уверен,что оно выделит тебе память линейно, а не одну строку в одном месте,а следующую через 100 байт?
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,730
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     Очистка памяти - ошибка
Еще ссылки по теме:

Vector, очистка памяти - C++
У меня есть вектор, который состоит из объектов типа класс. После выполнения данного блока мои объекты удаляются(вызываются ихние...

Очистка памяти. Бинарное дерево. - C++
Как очистить память если не удалось выделить её,очистить то что удлось выделить ,и как удалить память если удалось выделить, ...

Очистка памяти через деструктор - C++
Здравствуйте ! Надо написать к определенному классу конструктор/деструктор. class building { private: string...

Очистка динамической памяти очереди - C++
Доброго времени суток! Я вот думаю-думаю, но докумекать не могу. Я пишу очередь (основываюсь на логику и принцип очереди) так вот,...


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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru