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

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

Войти
Регистрация
Восстановить пароль
 
wikikino
0 / 0 / 0
Регистрация: 09.11.2011
Сообщений: 15
#1

Не могу удалить динамически выделенную память под массив - C++

25.02.2013, 22:24. Просмотров 420. Ответов 5
Метки нет (Все метки)

Здравствуйте. Изучил сегодня динамическое выделение памяти и не могу ее удалить. Подскажите где ошибка и, если возможно, объясните почему она возникла. Вот часть программы.
C++
1
2
3
4
5
6
7
8
9
10
try 
    {
        double *mass1= new double[size]; 
    }
    catch (bad_alloc & exept)
    {
        cout<<"There is no free space for "<<size<<" blocks of memory. The program will end. Goodby.";
        exit(1);
    }
    delete [] mass1;
И еще один вопрос: double *mass1= new double[size]; - что означает каждый double ? первый означает, что я выделяю массив, где буду хранить переменные типа double (если я правильно понял). А второй ? Спасибо большое.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 22:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу удалить динамически выделенную память под массив (C++):

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

Почему не очищает память, выделенную под массив структур - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; const int ar_size=20; struct CandyBar { char name; double...

Запись в динамически выделенную память - C++
Во общем, в dll выделяется память под char *, через new. Требуется в другой программе в которой я подключаю эту дллку переписать эти данные...

Как и когда правильно освобождать динамически выделенную память? - C++
Доброго времени суток! Задалась вопросом, заданным в заголовке темы &quot;Как и когда правильно освобождать динамически выделенную...

Динамически выделить память под массив - C++
Добрый день форусчани Как можно выделить память под массив объекта класса class Save_Colection { public: pk *field; ...

Динамически выделить память под массив - C++
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами максимальный элемент главной и побочной диагоналей с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
25.02.2013, 22:34 #2
double *mass1 - указатель на первый элемент массива типа double
new double[size]; - выделение памяти равной sizeof(double)*size
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,566
Записей в блоге: 4
25.02.2013, 22:40 #3
Цитата Сообщение от wikikino Посмотреть сообщение
И еще один вопрос: double *mass1= new double[size]; - что означает каждый double ? первый означает, что я выделяю массив, где буду хранить переменные типа double (если я правильно понял). А второй ? Спасибо большое.
Первый значит, - указатель на double. А второй нельзя интерпретировать в отрыве от new:
new double[size];
означает, - выделить память длиной сайз даблов и вернуть на неё указатель (на начало). Всё выражение, - выделение памяти и присваивание значения указателю. Чтобы потом можно было использовать и освободить. В Вашем примере, она освобождается без использования.
ps а память Вы освободили использя delete.
NeonLost
Пес войны
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
25.02.2013, 22:48 #4
проблема в том, что ты объявляешь переменную mass1 в одних скобках, а удалить пытаешься в другой облати видимости
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,566
Записей в блоге: 4
25.02.2013, 23:17 #5
Цитата Сообщение от NeonLost Посмотреть сообщение
проблема в том, что ты объявляешь переменную mass1 в одних скобках, а удалить пытаешься в другой облати видимости
Верно, объявить указатель нужно вне блока try:

C++
1
2
3
4
5
6
7
8
9
10
11
double *mass1;
try 
    {
       mass1= new double[size]; 
    }
    catch (bad_alloc & exept)
    {
        cout<<"There is no free space for "<<size<<" blocks of memory. The program will end. Goodby.";
        exit(1);
    }
    delete [] mass1;//if(mass1!=nullptr)delete [] mass1; излишне т.к. вылетит раньше, если не выделится
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
26.02.2013, 01:57 #6
Если не будет выделена память, то и удалять нечего ...

C++
1
2
3
4
5
6
7
8
9
10
try 
    {
       double *mass1= new double[size]; 
          // Делаем что-то ещё ...
       delete [] mass1;
    }
catch (const bad_alloc & e)
    {
        cerr<<e.what()<<"  size="<<size<<endl;
    }
А вообще для облегчения жизни есть умные указатели.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 01:57
Привет! Вот еще темы с ответами:

Динамически выделить память под массив функций - C++
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray&amp; ,const QByteArray&amp;); как сделать тоже самое только через new? как правильно...

Можно ли динамически выделить память под массив указателей, на объекты класса? - C++
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли строчку VisualizationTools* VT; заменить...

Нужно ли очищать память, выделенную под вектор? - C++
Доброго времени суток. При работе с динамическими массивами всегда чистил память оператором delete. Нужно ли делать тоже самое с векторами,...

Очистить динамическую память, выделенную под член структуры - C++
Объявление и инициализация объекта: pupil B = Constructor(&quot;MyName&quot;, 18, 50); Сама структура: struct pupil{ public: char *name =...


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

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

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