Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2011, 11:16   #11
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

f.hump

Каким местом С++ помогает забыть об утечках памяти?

RAII
Rififi вне форума Ответить с цитированием
Старый 13.10.2011, 13:23   #12
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2 Riffi

Мощно. Только RAII не означает, что компилятор сам догдается как построить деструктор, который правильно освободит ресурсы связанные с объектом. И это как раз не дает забыть.
f.hump вне форума Ответить с цитированием
Старый 14.10.2011, 17:50   #13
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Скажите еще- как быть с динамическим массивом объектов класса?
в смысле освобождение памяти
если я поступлю как с динамическим массивом переменных
Код:
#include <iostream>

using namespace std;

class main_class
{
    public:
        main_class ()
        {
            x = 1, y = 1;
            z = 5.0;
        }
    private:
        int x, y;
        double z;
};

int main()
{
    int n = 100;
    //создание динамического массива обектов
    main_class* object;
    object = new main_class [n];

    //освобождение памяти
    delete [] object;
    return 0;
}
так правильно? , для чего тогда нужен деструктор, или он как_то не явно вызывается, не смотря на то что я его не описывал?

Последний раз редактировалось SAMOUCHKA; 14.10.2011 в 20:35.
SAMOUCHKA вне форума Ответить с цитированием
Старый 14.10.2011, 21:00   #14
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

а вот видимо случай когда конструктор должен быть описан и вызван явно
Код:
class IMAGE
{
public:
IMAGE (char name_fileBMP[])
{
img = SDL_LoadBMP (name_fileBMP)//загрузка изображения из файла
}
private:
SDL_Surface* img;//объявление поверхности

};
int main (int argc, char *argv[])
{
//создаем объект класса
IMAGE ("image.bmp")

//
//
//тут надо освободить экранную поверхность поле img класса IMAGE
return 0;
}
очистка экранной поверхности производится с помощью функции
SDL_FreeSurface("image.bmp") как я понимаю эту функцию надо указать в деструкторе.
как это сделать? не разу практически не сталкивался
SAMOUCHKA вне форума Ответить с цитированием
Старый 14.10.2011, 22:52   #15
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
~IMAGE()
{
if (img) SDL_FreeSurface(img);
}
Цитата:
для чего тогда нужен деструктор, или он как_то не явно вызывается, не смотря на то что я его не описывал?
компилятор всегда создает деструктор (конструктор по умолчанию и копирующий конструктор), даже если явно он прописан не был.

Последний раз редактировалось f.hump; 14.10.2011 в 23:04.
f.hump вне форума Ответить с цитированием
Старый 18.10.2011, 11:00   #16
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

надоел наверно всем, но тем не менее еще один вопрос:
как правильно освободить память если и объект класса динамический и поле класса тоже динамический массив?
не надо-ли описывать деструктор явно?
Код:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <iomanip>

using namespace std;

class main_class
{
    public:
        main_class ()
        {
            s = 5;
            element = new int [s];
            for (int i = 0; i < s; i++)
            {
                element[i] = rand();
            }
        }
        void print_element ();
    private:
        int s;
        int* element;
};

int main()
{
    int size;
    main_class* array_class;

    cout<<"     ENTR SIZE ARRAY CLASS    ";
    cin>>size;
    cout<<endl<<endl;

    array_class = new main_class [size];

    for (int i = 0; i < size; i++)
    {
        array_class[i].print_element();
    }

    delete[] array_class;

    getch();

    return 0;
}

void main_class::print_element()
{
    for (int i = 0; i < s; i++)
    {
        cout<<setw(10)<<element[i];
    }
    cout<<endl;
}
если так, утечки памяти не будет?

Последний раз редактировалось SAMOUCHKA; 18.10.2011 в 11:03.
SAMOUCHKA вне форума Ответить с цитированием
Старый 18.10.2011, 11:31   #17
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

SAMOUCHKA

если так, утечки памяти не будет?

будет.
Rififi вне форума Ответить с цитированием
Старый 18.10.2011, 11:56   #18
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

а если добавить
Код:
~main_class ()
{
    delete[] element;
}
SAMOUCHKA вне форума Ответить с цитированием
Старый 18.10.2011, 11:56   #19
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
не надо-ли описывать деструктор явно?
Нужно ! Для каждой операции new должна быть своя delete.
Если выделение памяти идет в конструкторе, то в деструкторе надо сделать освобождение.
Код:
class main_class
{
    public:
// ...
        ~main_class ()
        {
            delete[] element;
        }
    private:
        int s;
        int* element;
};
An1ka вне форума Ответить с цитированием
Старый 18.10.2011, 12:16   #20
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

СПАСИБО! я так и думал
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение всего массива RedStorm Microsoft Office Excel 2 10.04.2011 12:54
C++ - изменение размера массива kefir Помощь студентам 1 19.06.2010 11:42
Задание размерности 2мерного массива Bernarditto Общие вопросы C/C++ 2 18.06.2010 17:04
Конструктор для изменения размерности массива and277 Общие вопросы C/C++ 2 10.08.2009 20:47
увеличение размерности массива Лучик_света Общие вопросы .NET 3 25.10.2008 04:36