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

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

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

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

27.11.2012, 03:29. Просмотров 460. Ответов 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 03:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объекты. Как правильно инициализировать и удалить перемнные (C++):

динамически создать/удалить объекты класса (правильно сделал?) - C++
создал класс: myclass { } завел вектор, в котором будут храниться указатели на объекты данного класса: vector <myclass*> ob; ...

Как правильно инициализировать сложный объект? - C++
Есть три класса: 1) point ->(double z, double y) 2) frame ->содержит CArray<point*,point*> 3) hull ->содержит CArray<frame*,frame*>...

Как правильно инициализировать статические члены класса? - C++
Я новичок и заранее прошу прощение за тупые вопросы. Имеются два класса: Solution и Pool. Pool состоит из нескольких обьектов класса...

Как правильно инициализировать динамический массив пользовательского класса - C++
Допустим есть класс: class A { public: A(); A(int a, int b, int c) {} }; и нам нужно инициализировать динамический...

Как правильно инициализировать данные-члены строкового типа в реализации функции-члена? - C++
Всем здравствуйте. У меня тут возникла очень глупая ошибка и я не могу понять в чем причина и как ее исправить. Значит, имеется структура. ...

Почему лучше инициализировать объекты класса во время инициализации конструктора? - C++
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

3
Avazart
Эксперт С++
7458 / 5504 / 314
Регистрация: 10.12.2010
Сообщений: 24,555
Записей в блоге: 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)]();
По убирайте скобки ()
0
vua72
416 / 416 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
27.11.2012, 11:25  [ТС] #3
Спасибо,но как в конструктор передать размерности массивов?
() обнуляют массивы, или я что-то не так понимаю?
0
vxg
Модератор
3208 / 2011 / 230
Регистрация: 13.01.2012
Сообщений: 7,790
27.11.2012, 11:42 #4
в пустом конструкторе всем указателям и размерам присвоить нули.
в функцию инициализации предавать размер, присваивать его полю объекта, выделять память.
в деструкторе освобождать память
0
27.11.2012, 11:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 11:42
Привет! Вот еще темы с ответами:

Как правильно массиву объектов присвоить ссылки на объекты. - C++
TPoint Point,*p_Point; p_Point = Point; TPoint Mass; for (i=0; i<10; i++) { Mass = p_Point; //вот не задвоятся ли у меня...

Как правильно объявлять статические константные объекты в классе? - C++
В классе надо объявить статичные константные строки. Типа class A { public: static const std::string OLOLO = "ololo"; } Но так...

Стек или куча: как "правильно" создавать объекты классов? - C++
У меня несколько странновато-ламерский вопрос, но ведь в том и смысл: чтобы таких вопросов не осталось, на них один фиг сначала нужно...

Как правильно удалить строку из файла? - C++
void deletez(char db) {data *p; int nomer; readdb(db); ofstream f; f.open(db); cout<<"kakoy nomer udalit?"<<endl; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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