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

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

Войти
Регистрация
Восстановить пароль
 
vua72
414 / 414 / 85
Регистрация: 28.11.2010
Сообщений: 1,175
Завершенные тесты: 1
#1

Объекты. Как правильно инициализировать и удалить перемнные - C++

27.11.2012, 03:29. Просмотров 386. Ответов 3
Метки нет (Все метки)

Есть довольно сложная задача. 1-й класс считает. 2-й класс делает интерфейс.
Первый от второго получает значения переменных и создает кучу массивов, в т.ч. массивов структур. Как правильно организовать выделение памяти под массивы и другие динамические переменные. Есть проблема утечки памяти, вроде все динамические массивы и переменные убиты в конце.
Если я не прав, подскажите как организовать обмен между этими объектами этих двух классов.
Спасибо.
PS. Сейчас интерфейс на QT, но может потребоваться его делать под другой фреймворк.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
 * Calc.h
 *
 *  Created on: 06.12.2010
 *      Author: admin
 */
#ifndef CALC_H_
#define CALC_H_
class Calc
{
private:
   struct trans {...} *marr; 
   double *mas;  
   ....
  и разные методы.
public:
    Calc();
    ~Calc();
    int n;
...
    void Init();
    void CalcIt();
 
};
#endif /* CALCS_H_ */
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Calc::Calc()
{
    Pi=3.1415926535897931;
}
Calc::~Calc()
{
    
    delete [] mas1 аналогично и остальные массивы
 
}
 
void CalcSat::Init()
{
    /*
        функция начальной инициализации перемнных класса,
    */
    vect =   new trans[n](); // 
    vect1=   new double [n]();
    Calc::mas1  = new double[pointX.masDim * pointY.masDim*sizeof(double)](); 
    Calc::mas2 = new double[pointX.masDim * pointY.masDim*sizeof(double)]();
     и.т.д.
и еще
struct trans {...} *marr; в заголовочном файле
и
marr = new trans[n]() в void CalcSat::Init(); cppcheck ругается на подобную строку в Init и говорит, что
Possible leak in public function. The pointer 'marr' is not deallocated before it is allocated.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 03:29     Объекты. Как правильно инициализировать и удалить перемнные
Посмотрите здесь:

Как правильно инициализировать статические члены класса? C++
C++ Как правильно массиву объектов присвоить ссылки на объекты.
Как правильно инициализировать сложный объект? C++
динамически создать/удалить объекты класса (правильно сделал?) C++
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
C++ Как объявить указатель на массив через typedef и как инициализировать такой тип
C++ Как правильно удалить строку из файла?
Удалить повторяющиеся объекты в векторе C++
Как правильно инициализировать динамический массив пользовательского класса C++
C++ Как правильно инициализировать данные-члены строкового типа в реализации функции-члена?
Как правильно объявлять статические константные объекты в классе? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,913
Записей в блоге: 17
27.11.2012, 04:36     Объекты. Как правильно инициализировать и удалить перемнные #2
Как правильно инициализировать и удалить перемнные
В конструкторе инициализировать и выделить память если надо , в деструкторе освободить память если она выделялась.

Чтобы облегчить себе задаю вместо дин.массивов используйте std::vector ( или QVector ) что бы не заботиться об освобождении памяти.

Добавлено через 7 минут
C++
1
2
3
4
    vect =   new trans[n](); // 
    vect1=   new double [n]();
    Calc::mas1  = new double[pointX.masDim * pointY.masDim*sizeof(double)](); 
    Calc::mas2 = new double[pointX.masDim * pointY.masDim*sizeof(double)]();
По убирайте скобки ()
vua72
414 / 414 / 85
Регистрация: 28.11.2010
Сообщений: 1,175
Завершенные тесты: 1
27.11.2012, 11:25  [ТС]     Объекты. Как правильно инициализировать и удалить перемнные #3
Спасибо,но как в конструктор передать размерности массивов?
() обнуляют массивы, или я что-то не так понимаю?
vxg
Модератор
 Аватар для vxg
2857 / 1790 / 181
Регистрация: 13.01.2012
Сообщений: 6,755
27.11.2012, 11:42     Объекты. Как правильно инициализировать и удалить перемнные #4
в пустом конструкторе всем указателям и размерам присвоить нули.
в функцию инициализации предавать размер, присваивать его полю объекта, выделять память.
в деструкторе освобождать память
Yandex
Объявления
27.11.2012, 11:42     Объекты. Как правильно инициализировать и удалить перемнные
Ответ Создать тему
Опции темы

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