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

Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз - C++

Восстановить пароль Регистрация
 
 
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
26.01.2014, 17:55     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #1
Как можно организовать класс, а так же создание объекта класса, чтобы он постоянно висел в памяти на протяжении всей работы программы, и чтобы память выделялась один раз. Я пытаюсь написать программу, где основной код в одном файле, описание и объявления - в других. У меня имеется один метод для проверки на файл, где сохранена некоторая информация, и эту же информацию считывает в переменную. Если создать объект, а потом удалить его в одном из case оконной функции, то пропадает переменная с названием файла. Если объявить как глобальную переменную, то захламляется память.
Мне нужно, чтобы WM_CREATE подготовила файл, а WM_PAINT считала его и отобразила содержимое.
простите за ахинею. Чтобы было понятней, выложу весь проект.
Вложения
Тип файла: rar Talon.rar (358.9 Кб, 4 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2014, 17:55     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз
Посмотрите здесь:

как сделать программно чтобы программа была постоянно на заднем плане C++
Возможно ли создание объекта шаблонного класса в функции этого класса? C++
динамическое выделение памяти для объекта класса C++
Как сделать, чтобы функция класса могла работать с обьектами другого класса C++
Создание объекта в области памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
26.01.2014, 18:53     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #2
1 способ. Объявите Экземпляр класса в глобальной области.
2 способ. Добавьте префикс static перед объявлением экземпляра класса.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.01.2014, 20:24     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #3
C++
1
case  WM_CREATE:{TUchenik NameFile; NameFile.NameFile(HProg, Hwnd); NameFile.~TUchenik(); break;}//подготовит файл настроек
Деструктор вручную не вызывают. Объект NameFile создан в локальной области, при выходе из которой, будет автомаически вызыван деструктор.
В методе TUchenik::Write_and_Out утечка памяти:
C++
1
2
3
4
TUchenik *Uchenik;
    
Uchenik = new TUchenik[k];
...
Память выделена, а освобождение где?
В классе TUchenik есть массивы указателей:
C++
1
WCHAR *NameOfFile[90], WCHAR *Name_Sys_File[10]
Где память под эти указатели выделяется?
C++
1
wchar_t *name;  WCHAR *surname; WCHAR *klass; WCHAR *bukva;   WCHAR *identifier;
Под эти указатели тоже не видно, где память выделяется.
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
27.01.2014, 22:21  [ТС]     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #4
Цитата Сообщение от alsav22 Посмотреть сообщение
В классе TUchenik есть массивы указателей:
C++
1
WCHAR *NameOfFile[90], WCHAR *Name_Sys_File[10]
Где память под эти указатели выделяется?
C++
1
wchar_t *name;  WCHAR *surname; WCHAR *klass; WCHAR *bukva;   WCHAR *identifier;
Под эти указатели тоже не видно, где память выделяется.
Память выделил (в конструкторе) под все массивы указателей, утечку памяти устранил.

Подскажите, пожалуйста, почему программа вылетает в момент создания окна (WM_CREATE)? Мое предположение - это неумение работать с указателями.
Вложения
Тип файла: rar Talon.rar (362.3 Кб, 4 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.01.2014, 23:40     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #5
Цитата Сообщение от casper007 Посмотреть сообщение
утечку памяти устранил.
Укажите где:
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
26
27
28
29
30
31
32
33
34
35
36
37
int TUchenik::Write_and_Out(HWND HWin1, HWND HW,int k, int flag)
{
   TUchenik *Uchenik;
    
    Uchenik = new TUchenik[k];
        
  int i;
  DC=BeginPaint(HW,&ps);
  SelectObject(DC,HF);
 
  TextOutW(DC, 10,20,L"Список класса", 13);
  MoveToEx(DC, 10,38, NULL); LineTo(DC,585,38);
 
  TextOutW(DC, 15 , 42, L"Имя"    , 3);
  TextOutW(DC, 205, 42, L"Фамилия", 7);
  TextOutW(DC, 465, 42, L"Класс"  , 5);
  TextOutW(DC, 535, 42,L"Буква",    5);
  MoveToEx(DC,  10, 60  , NULL); LineTo(DC,585,60);
 
                                
                             
{wofstream File(*NameOfFile);
  for(i=0; i<k; i++)
     {  GetDlgItemText(HWin1,IDD_EDIT1,*Uchenik[i].name    ,52);
        GetDlgItemTextW(HWin1,IDD_EDIT2,*Uchenik[i].surname ,70);
        GetDlgItemTextW(HWin1,IDD_EDIT3,*Uchenik[i].klass, 4);
        GetDlgItemText(HWin1,IDD_EDIT4,*Uchenik[i].bukva,2);
      TextOutW(DC, 15, 46+(i+1)*20-2, *Uchenik[i].name   , wcslen(*Uchenik[i].name)   );
       TextOutW(DC,205, 46+(i+1)*20-2, *Uchenik[i].surname, wcslen(*Uchenik[i].surname));
       TextOutW(DC,475, 46+(i+1)*20-2, *Uchenik[i].klass,   wcslen(*Uchenik[i].klass)  );
       TextOutW(DC,528, 46+(i+1)*20-2, *Uchenik[i].bukva,   wcslen(*Uchenik[i].bukva)  );
       MoveToEx(DC, 10, 40+(i+2)*20, NULL); LineTo(DC,585,40+(i+2)*20);
       
       File<<numb<<"\t"<<name<<"\t"<<surname<<"\t"<<klass<<"\t"<<bukva<<"\n";
  }
      File.close();
}
Цитата Сообщение от casper007 Посмотреть сообщение
Память выделил (в конструкторе) под все массивы указателей
Разберитесь, что вам нужно в классе: массивы WCHAR или массивы указателей на WCHAR, и как память под массивы указателей выделяется.
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
WCHAR *name[40];    
WCHAR *surname[60]; 
WCHAR *klass[6];     
WCHAR *bukva[2];  
WCHAR *identifier[100]; // puple data
WCHAR *NameOfFile[90]; 
WCHAR *Name_Sys_File[10];// job of file
FILE *File; 
FILE *SysFile;
 
*Name_Sys_File=new WCHAR[10];
*Name_Sys_File=L"seting.tal";
*NameOfFile = new WCHAR[90];
*name = new WCHAR[40]; 
*surname = new WCHAR[60] ; 
*klass = new WCHAR[6]; 
*bukva = new WCHAR[2];   
*identifier = new WCHAR[50];
*NameOfFile=NULL;
*name=NULL;
*surname=NULL;
*bukva=NULL; 
*identifier=NULL; 
*klass=NULL;
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
28.01.2014, 00:09  [ТС]     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Укажите где]
delete []Uchenik;

Мне нужен просто массив.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.01.2014, 02:49     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #7
Цитата Сообщение от casper007 Посмотреть сообщение
delete []Uchenik;
Где это в коде?
Цитата Сообщение от casper007 Посмотреть сообщение
Мне нужен просто массив.
Значит убирайте звёздочки.

Добавлено через 2 часа 24 минуты
Цитата Сообщение от casper007 Посмотреть сообщение
Подскажите, пожалуйста, почему программа вылетает в момент создания окна (WM_CREATE)?
Из-за ошибки в Glaw_Win().
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
28.01.2014, 10:24  [ТС]     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Где это в коде?
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
int TUchenik::Write_and_Out(HWND HWin1, HWND HW,int k, int flag)
{
    TUchenik *Uchenik;
    
    Uchenik = new TUchenik[k];
        
int i;
  DC=BeginPaint(HW,&ps);
  SelectObject(DC,HF);
 
  TextOutW(DC, 10,20,L"Список класса", 13);
  MoveToEx(DC, 10,38, NULL); LineTo(DC,585,38);
 
  TextOutW(DC, 15 , 42, L"Имя"    , 3);
  TextOutW(DC, 205, 42, L"Фамилия", 7);
  TextOutW(DC, 465, 42, L"Класс"  , 5);
  TextOutW(DC, 535, 42,L"Буква",    5);
  MoveToEx(DC,  10, 60  , NULL); LineTo(DC,585,60);
 
                                
                             
{wofstream File(NameOfFile);
  for(i=0; i<k; i++)
     {  GetDlgItemText(HWin1,IDD_EDIT1,*Uchenik[i].name    ,52);
        GetDlgItemTextW(HWin1,IDD_EDIT2,*Uchenik[i].surname ,70);
        GetDlgItemTextW(HWin1,IDD_EDIT3,*Uchenik[i].klass, 4);
        GetDlgItemText(HWin1,IDD_EDIT4,*Uchenik[i].bukva,2);
      TextOutW(DC, 15, 46+(i+1)*20-2, *Uchenik[i].name   , wcslen(*Uchenik[i].name)   );
       TextOutW(DC,205, 46+(i+1)*20-2, *Uchenik[i].surname, wcslen(*Uchenik[i].surname));
       TextOutW(DC,475, 46+(i+1)*20-2, *Uchenik[i].klass,   wcslen(*Uchenik[i].klass)  );
       TextOutW(DC,528, 46+(i+1)*20-2, *Uchenik[i].bukva,   wcslen(*Uchenik[i].bukva)  );
       MoveToEx(DC, 10, 40+(i+2)*20, NULL); LineTo(DC,585,40+(i+2)*20);
       
       File<<numb<<"\t"<<name<<"\t"<<surname<<"\t"<<klass<<"\t"<<bukva<<"\n";
  }
      File.close();
}
          
   
 
  MoveToEx(DC,  10, 40, NULL); LineTo(DC,  10, 40+(i+1)*20);
  MoveToEx(DC, 200, 40, NULL); LineTo(DC, 200, 40+(i+1)*20);
  MoveToEx(DC, 460, 40, NULL); LineTo(DC, 460, 40+(i+1)*20);
  MoveToEx(DC, 515, 40, NULL); LineTo(DC, 515, 40+(i+1)*20);
  MoveToEx(DC,585,  40,NULL); LineTo(DC,585,   40+(i+1)*20);
  MoveToEx(DC,100,40,NULL);
 
  EndPaint(HW,&ps);
  delete []Uchenik;  //////////////////////////////////////////////////////тут
  return 0;
}
Если указатель Name_Sys_File сделать массивом, то компилятор ругается. Если объявить переменную wchar_t *, то все нормально. Все равно же придется использовать указатель для этой переменной. Конечно, хотелось бы сделать ее константной еще в описании класса, чтобы сразу задать имя, но не получается.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.01.2014, 16:14     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #9
Цитата Сообщение от casper007 Посмотреть сообщение
Если указатель Name_Sys_File сделать массивом, то компилятор ругается.
Делайте правильно, тогда не будет ругаться.
Цитата Сообщение от alsav22 Посмотреть сообщение
Где это в коде?
Я спрашивал про код, который выложен в 4 посте, и про который было написано:
Цитата Сообщение от casper007 Посмотреть сообщение
утечку памяти устранил.
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
28.01.2014, 19:08  [ТС]     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #10
Цитата Сообщение от alsav22 Посмотреть сообщение
:

Вот проект
Вложения
Тип файла: rar Talon.rar (363.9 Кб, 4 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.01.2014, 19:14     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #11
Цитата Сообщение от casper007 Посмотреть сообщение
Вот проект
Надеюсь, компилируется?
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
28.01.2014, 19:16  [ТС]     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Надеюсь, компилируется?
Да, компилируется, как ни странно)))
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
28.01.2014, 19:33     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #13
Цитата Сообщение от casper007 Посмотреть сообщение
чтобы он постоянно висел в памяти на протяжении всей работы программы
casper007, тогда не удаляйте, пока работа не завершится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LRESULT CALLBACK Glaw_Win(HWND Hwnd,UINT message,WPARAM wParam, LPARAM lParam)
{
 
  static classA * a = 0; /* объявим с атрибутом  static */
 
 switch(message)
 {
 case  WM_CREATE:{  a = new classA; /* здесь создаём объект */
    // ...
      break;}
 case  WM_DESTROY:{  delete a;  /* здесь удаляем */
   PostQuitMessage(0);break;}
     default:{return(DefWindowProc(Hwnd,message,wParam,lParam));}
}
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.01.2014, 20:58     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #14
Утечка памяти как была, так и есть.
wchar_t* NameOfFile - под этот указатель, где память выделяется?
WCHAR* identifier[100] - опять массив указателей?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
28.01.2014, 20:59     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #15
Прочитайте про паттерн Синглтон.

Добавлено через 34 секунды
(В код не вникал ибо .rar)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.01.2014, 21:08     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #16
И зачем в классе это: FILE File, FILE SysFile? Вы их то как указатели напишите, то просто, но в коде никак не используете.
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
28.01.2014, 23:48  [ТС]     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #17
Цитата Сообщение от alsav22 Посмотреть сообщение
FILE File, FILE SysFile?
Они используются для работы с файлами, и я не работаю с ними как с указателями . SysFile связывается с файлом с настройками, File с базой.
Как указатель только в диалоговой функции, но только SysFile, но уже исправил.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 00:36     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #18
Цитата Сообщение от casper007 Посмотреть сообщение
SysFile связывается с файлом с настройками, File с базой.
Как указатель только в диалоговой функции, но только SysFile, но уже исправил.
Я не вижу, чтобы те File и SysFile, которые используются в коде, имели бы какое-то отношение к полям класса TUchenik: File и SysFile.

Добавлено через 2 минуты
У вас и методов дотупа к ним нет, чтобы можно было использовать их где-то помимо методов самого класса TUchenik. Но и в методах класса они не используются.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 06:39     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #19
Красота неописуемая!
Миниатюры
Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2014, 07:29     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз
Еще ссылки по теме:

Преобразовать все слова массива так, чтобы каждый символ в слове повторялся один раз, сохранив общий порядок следования символов C++
Создание объекта в области памяти C++
C++ Переставить в быстрой сортировке вывод результата так чтобы он выполнялся один раз

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 07:29     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз #20
Так ещё красивше...
Миниатюры
Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз  
Yandex
Объявления
29.01.2014, 07:29     Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз
Ответ Создать тему
Опции темы

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