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

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

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

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

11.04.2013, 23:34. Просмотров 460. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 23:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очистка памяти - ошибка (C++):

Очистка памяти - C++
Подскажите пожалуйста что не так делаю, создаю массив лейблов: TLabel **Labels; Labels = new TLabel*; for(int i = 0; i &lt; rabot +...

очистка памяти - C++
в данном случае деструктор очистит всё, или нет? #include &quot;base.h&quot; #include &lt;cstdlib&gt; #include &lt;ctime&gt; base::base(int x,int y) { ...

Очистка памяти - C++
Как правильно очистить память в массиве классов Вот код конструктора, выделяющего память, и деструктора. Выдает ошибку в самом конце...

Очистка памяти - C++
Вот сделал лабу и все работает отлично, но осталось последнее new выделяет память мне нужно добавить функцию которая будет вызыватся в...

Очистка памяти - C++
При выполнении программы, память приложения растёт, а она должна быть неизменной. int main() { setlocale(LC_ALL, &quot;Russian&quot;); ...

Очистка памяти - C++
Цель: Написать программу, которая читает текст из файла и записывает в новый файл те слова, которые содержат буквы, введенные с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
11.04.2013, 23:41 #2
C++
1
array[i][j] = 0;
Вместо вот того вот...в цикле.
1
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;
1
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;
в этой строчке, как я понимаю - двигаемся от адреса нулевого эл-та массива, и в нужную ячейку записываем значение. Но вот как оно сказывается на выделении-освобождении памяти???
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
11.04.2013, 23:54 #5
Цитата Сообщение от OdessaNA Посмотреть сообщение
ак я понимаю - адресная арифметика положительно сказывается на быстродействии программы.
никак она не сказывается
это две записи одного и того же
а накосячить в адресной можно на раз
тем более что современные оптимизаторы оптимизируют код лучше чем ты
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:57 #6
OdessaNA, кроме всего прочего, ты уверен,что оно выделит тебе память линейно, а не одну строку в одном месте,а следующую через 100 байт?
1
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
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
1
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
12.04.2013, 00:04  [ТС] #8
Цитата Сообщение от metaluga145 Посмотреть сообщение
OdessaNA, кроме всего прочего, ты уверен,что оно выделит тебе память линейно, а не одну строку в одном месте,а следующую через 100 байт?
...ну да. В куче выделение памяти не обязательно "одним куском". Вот и ответ на мой вопрос.
Подобная форма записи подходит для статических массивов.

Всем спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 00:04
Привет! Вот еще темы с ответами:

Ссылки и очистка памяти - C++
Здравствуйте! Если я создаю ссылку и присваиваю ей значение (константу или нет) должен я как и с указателями заботится об памяти? ...

Указатели и очистка памяти - C++
Возник интересный вопрос... class Test { int a; }; class Test1 : public Test { int b, c; }; int main() { Test1 *t = new Test1; ...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.04.2013, 00:04
Ответ Создать тему
Опции темы

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