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

С++ течет при наследовании - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.01.2013, 18:27     С++ течет при наследовании #1
Если был создан класс где его поля размещались в стеке (Foo)
и унаследован классом (Foo1) который создается динамически.

Как управиться с памятью? Поможет ли вызов деструктора в деструкторе решить эту проблемму или как делаете вы?
C++
1
2
3
4
~Foo1()
{
~Foo();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
25.01.2013, 23:55  [ТС]     С++ течет при наследовании #21
gray_fox, Понял, запихнул по ошибке в конструктор, то что должно быть в деструкторе.
Но инициализация есть
Цитата Сообщение от vbloodv Посмотреть сообщение
C++
1
2
3
4
void Map::Create(HGE ** _hge)
{
* * hge = *_hge;
* * Cup * cups = new Cup[COUNT_N];
вот в этой функции. Меня больше волнуют мой список(std::list<point2d> Way и вектор(Border pointBorder ?

~OhMyGodSoLong~, Есть какие нибудь ошибки которые можно на лету увидеть?
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Поэтому ресурсы, которые требуют ручного очищения,
Возможно мои к таким ресурсам и относятся, правильно удалять list через ~list() и вектор через ~vector();?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
26.01.2013, 00:06     С++ течет при наследовании #22
Цитата Сообщение от vbloodv Посмотреть сообщение
правильно удалять list через ~list() и вектор через ~vector();
Неправильно, деструкторы на то и придуманы, чтобы вызываться автоматически. Если вызвать деструктор самостоятельно - то по сути он будет вызван дважды. Пожалуй единственный случай, когда явный вызов деструктора имеет смысл - использование placement new.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:32  [ТС]     С++ течет при наследовании #23
gray_fox, представление поменялось. Я сильно усложнил многое. подскажи ещё почему при попадании на
C++
1
 delete[] cups;
программа вылетает ?


Уже не вылетает ! Но показывает утечки

Добавлено через 13 минут
Зановес ! :
const int COUNT_N = 9; // размер
Cup * cups[COUNT_N]; // объявление, член класса C_map.h
Cup * cups = new Cup[COUNT_N]; // инициализация в констукторе C_map.h [УТЕЧКА !]
delete[] cups; // удаление в деструкторе C_map.h

[УТЕЧКА] Visual Leak Detector detected 12 memory leaks (2768 bytes).

если заменяю
C++ (Qt)
1
Cup * cups = new Cup;
, то утечка:
Visual Leak Detector detected 4 memory leaks (460 bytes).

Нашел ещё утечку в удалении текстур и спрайта. Есть ли ошибка в cups ?
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
26.01.2013, 00:33     С++ течет при наследовании #24
Цитата Сообщение от vbloodv Посмотреть сообщение
показывает утечки
В последнем коде вроде больше нет выделения памяти.

Добавлено через 20 секунд
Если cups удаляешь.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
26.01.2013, 00:38     С++ течет при наследовании #25
Цитата Сообщение от vbloodv Посмотреть сообщение
const int COUNT_N = 9; // размер
Cup * cups[COUNT_N]; // объявление, член класса C_map.h
Cup * cups = new Cup[COUNT_N]; // инициализация в констукторе C_map.h [УТЕЧКА !]
delete[] cups; // удаление в деструкторе C_map.h
Если действительно всё так, то массив указателей cups, объявленный членом класса и указатель cups на массив элементов Cup, объявленный в конструкторе - разные сущности
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
26.01.2013, 00:40     С++ течет при наследовании #26
Цитата Сообщение от vbloodv Посмотреть сообщение
если заменяю
Программирование подбором? Правила то простые - если сделал new - сделай delete, аналогично с new[]/delete[]. А лучше, как уже не раз здесь писали, пользоваться умными указателями и вообще не иметь головной боли с управлением ресурсами. Возможно HGE требует деинициализации.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Если действительно всё так, то массив указателей cups, объявленный членом класса и указатель cups на массив элементов Cup, объявленный в конструкторе - разные вещи и разные сущности
а слона то я и не заметил...)

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
26.01.2013, 00:43     С++ течет при наследовании #27
C++
1
2
3
4
void Map::Create(HGE ** _hge)
{
    hge = *_hge;
    Cup * cups = new Cup[COUNT_N];
Это объявление нового указателя с именем cups, локального для данной функции

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
а слона то я и не заметил...)
ну что ж поделаешь то...бывает

vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:52  [ТС]     С++ течет при наследовании #28
Croessmah, gray_fox, Я могу инициализацию член именно поле класса?
Вроде бы поля только статические можно инициализировать, а в конструкторе если только через this...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
26.01.2013, 00:53     С++ течет при наследовании #29
Цитата Сообщение от vbloodv Посмотреть сообщение
а в конструкторе если только через this...
C++
1
2
const int COUNT_N = 9; // размер
Cup * cups; // объявление, член класса C_map.h
а в констукторе тогда(ну или в функции create):
C++
1
cups = new Cup[COUNT_N]; // инициализация в констукторе C_map.h
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:58  [ТС]     С++ течет при наследовании #30
Croessmah, Мне стыдно только что new[] в msdn прочитал. Напутал в синтаксисе и думал высокие материи...
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
26.01.2013, 01:01     С++ течет при наследовании #31
vbloodv, предлагаю, если это возможно, избавиться от метода Create и инициализировать всё в конструкторе. Примерно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Map::Map(HGE ** hge)
      : hge(hge)
      , cups(new Cup[COUNT_N]) {
   // mainMap
    imageMap.SetTexture(hge->Texture_Load("image//map.png"));
    imageMap.SetSize(815,461);
    imageMap.SetZoom(300);
    imageMap.SetPos(400,225);
    imageMap.SetOrder(0.5f);
    // miniMap
    imageMini.SetTexture(hge->Texture_Load("image//map.png"));
    imageMini.SetSize(815,461);
    imageMini.SetZoom(100);
    imageMini.SetPos(100,500);
    imageMini.SetOrder(0.2f);
    // Load
    loadFromFile();
    BuildCup();
}
 
Map::~Map() {
   delete[] cups;
}
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 01:14  [ТС]     С++ течет при наследовании #32
Цитата Сообщение от gray_fox Посмотреть сообщение
C++ (Qt)
1
2
Map::Map(HGE ** hge)
* * * : hge(hge
Как пользоваться такими моментами ?


:hge(hge) - непонятен

Добавлено через 4 минуты
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
HGE * hge;
Map map;
Cup cup;
//boost::shared_ptr<HGE> hge(hgeCreate(HGE_VERSION), boost::bind(&HGE::Release, _1));
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    hge = hgeCreate(HGE_VERSION);
    hge->System_SetState(HGE_LOGFILE, "Phenomen.log");
    hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
    hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
    hge->System_SetState(HGE_TITLE, "Phenomen Game");
    hge->System_SetState(HGE_WINDOWED, true);
    hge->System_SetState(HGE_SCREENWIDTH, 800);
    hge->System_SetState(HGE_SCREENHEIGHT, 600);
    hge->System_SetState(HGE_SCREENBPP, 32);
    if(hge->System_Initiate())
    {   
        map.Create(&hge); // ИНИЦИАЛИЗАЦИЯ ПОСЛЕ HGE
         ...
bool FrameFunc()
{
...
bool RenderFunc()
{
...
Наверное нельзя, потому что тогда инициализация hge еще ну будет начата
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
26.01.2013, 01:15     С++ течет при наследовании #33
vbloodv, список инициализации конструктора. В данном случае можно заменить на
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
Map::Map(HGE ** _hge) {
   hge = _hge;
   cups = new Cup[COUNT_N];
 
   // mainMap
    imageMap.SetTexture(hge->Texture_Load("image//map.png"));
    imageMap.SetSize(815,461);
    imageMap.SetZoom(300);
    imageMap.SetPos(400,225);
    imageMap.SetOrder(0.5f);
    // miniMap
    imageMini.SetTexture(hge->Texture_Load("image//map.png"));
    imageMini.SetSize(815,461);
    imageMini.SetZoom(100);
    imageMini.SetPos(100,500);
    imageMini.SetOrder(0.2f);
    // Load
    loadFromFile();
    BuildCup();
}
 
Map::~Map() {
   delete[] cups;
}
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:05  [ТС]     С++ течет при наследовании #34
Не все просто у меня получается:

Вот такой код (его часть):

C++
1
2
3
4
5
void Map::Create(HGE ** _hge)
{
    hge = *_hge;
    cups = new Cup[COUNT_N];
    delete[] cups;
отлично компилируется и не показывает утечек.

delete[] cups; - при попадании в деструктор вызывает fail, возможно что delete[] вызывается сам или cups удаляется при выходе из области видимости функции create ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
26.01.2013, 02:09     С++ течет при наследовании #35
Может код map покажете? А то старый уже не актуален из-за исправлений.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:14  [ТС]     С++ течет при наследовании #36
Croessmah, Конечно, извиняюсь...
map.cpp
Кликните здесь для просмотра всего текста
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
#include "c_Map.h"
Map::Map(){}
Map::~Map()
{
    delete[] cups; // тут не работает
}
void Map::Create(HGE ** _hge)
{
    hge = *_hge;
    cups = new Cup[COUNT_N];
    //delete[] cups;    // тут работает !
    // mainMap
    imageMap.SetTexture(hge->Texture_Load("image//map.png"));
    imageMap.SetSize(815,461);
    imageMap.SetZoom(300);
    imageMap.SetPos(400,225);
    imageMap.SetOrder(0.5f);
    // miniMap
    imageMini.SetTexture(hge->Texture_Load("image//map.png"));
    imageMini.SetSize(815,461);
    imageMini.SetZoom(100);
    imageMini.SetPos(100,500);
    imageMini.SetOrder(0.2f);
    // Load
    loadFromFile();
    BuildCup();
}

map.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#include <hge.h>
const int COUNT_N = 9;
typedef  HGE * pHGE;
enum colorMap {null = 0, yellow, green, blue, violet, red, grey };
 
#include "c_Cup.h"
class Map
{
private:
    pHGE hge;
    Picture imageMap;
    Picture imageMini;
    int startMap[COUNT_N],finishMap[COUNT_N];
    Cup * cups;
public:
    Map();
    ~Map();
    void Create(HGE ** _hge);
    void Draw();
    void loadFromFile();
    void BuildCup();
};

main()
Кликните здесь для просмотра всего текста
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "Phenomen.h"
HGE * hge;
Map map;
Cup cup;
//boost::shared_ptr<HGE> hge(hgeCreate(HGE_VERSION), boost::bind(&HGE::Release, _1));
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    hge = hgeCreate(HGE_VERSION);
    hge->System_SetState(HGE_LOGFILE, "Phenomen.log");
    hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
    hge->System_SetState(HGE_RENDERFUNC, RenderFunc);
    hge->System_SetState(HGE_TITLE, "Phenomen Game");
    hge->System_SetState(HGE_WINDOWED, true);
    hge->System_SetState(HGE_SCREENWIDTH, 800);
    hge->System_SetState(HGE_SCREENHEIGHT, 600);
    hge->System_SetState(HGE_SCREENBPP, 32);
    if(hge->System_Initiate())
    {   
        cup.SetTexture(hge->Texture_Load("image//vbloodv.png"));
        cup.SetZoom(50);
        cup.SetOrder(0.5f);
        cup.SetSize(200.0f,200.0f);
        cup.SetPos(200,200);
        map.Create(&hge);
        mouse.texture = hge->Texture_Load("image//vbloodv_cursor.png");
        mouse.sprite = new hgeSprite(mouse.texture,0,0,32,32);
        hge->System_Start();
    }
    hge->Texture_Free(mouse.texture);
    delete mouse.sprite;
    hge->System_Shutdown();
    hge->Release();
    //map.~Map();
    //cup.~Cup();
    return 0;
}
 
 
bool FrameFunc()
{
    if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true;
 
    if (hge->Input_KeyDown(HGEK_LBUTTON))
    {
        cup.MoveToPoint(mouse.x,mouse.y);
        cup.PressCup();
    }
    if (hge->Input_KeyDown(HGEK_DOWN))
    {
        cup.MoveToPoint(200,200);
    }
 
    cup.Move();
    hge->Input_GetMousePos(&mouse.x,&mouse.y);
return false;
}
 
bool RenderFunc()
{
    hge->Gfx_BeginScene();
    hge->Gfx_Clear(RGB(0,0,0));
    //map.Draw();
    hge->Gfx_RenderQuad(cup.GetQuad());
    if (hge->Input_IsMouseOver())
    {
        mouse.sprite->Render(mouse.x,mouse.y);
        hge->System_SetState(HGE_HIDEMOUSE, true);
    }
    else
    {
        hge->System_SetState(HGE_HIDEMOUSE, false);
    }
    hge->Gfx_EndScene();
 
return false;
}


Если есть какие нарекания все учту !
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
26.01.2013, 02:30     С++ течет при наследовании #37
добавьте функцию в main.cpp
C++
1
2
3
4
void foo(HGE ** _hge){
   Map mytestmp;
   mytesttmp.Create(_hge);
}
И вызовете её в WinMain перед map.Create(&hge)
C++
1
2
foo(&hge);
map.Create(&hge);
после вызова foo (точнее после выхода из нее) поизодет ли ошибка?
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:39  [ТС]     С++ течет при наследовании #38
Croessmah, Да, выбило ошибку программа разламалась в деструкторе !
В деструкторе mytesttmp на выходе из функции (((
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12282 / 6969 / 784
Регистрация: 27.09.2012
Сообщений: 17,282
Записей в блоге: 2
Завершенные тесты: 1
26.01.2013, 02:44     С++ течет при наследовании #39
Содержимое функций-членов
C++
1
2
    void loadFromFile();
    void BuildCup();
Выложите.
А еще лучше из функции Create уберите вызовы этих функций и посмотрите происходит ли ошибка при выходе из foo
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2013, 02:48     С++ течет при наследовании
Еще ссылки по теме:

C++ Неоднозначность при наследовании
Деструктор при наследовании C++
C++ Присвоение при наследовании
Ошибка при наследовании C++
Ошибка при наследовании C++

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

Или воспользуйтесь поиском по форуму:
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:48  [ТС]     С++ течет при наследовании #40
Croessmah,
Кликните здесь для просмотра всего текста
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
void Map::loadFromFile()
{
    // startMap
    startMap[1] = yellow;
    startMap[2] = green;
    startMap[3] = grey;
    startMap[4] = null;
    startMap[5] = null;
    startMap[6] = null;
    startMap[7] = blue;
    startMap[8] = violet;
    startMap[9] = red;
    // finishMap
    finishMap[1] = red;
    finishMap[2] = violet;
    finishMap[3] = blue;
    finishMap[4] = null;
    finishMap[5] = null;
    finishMap[6] = null;
    finishMap[7] = grey;
    finishMap[8] = yellow;
    finishMap[9] = green;
}
 
void Map::BuildCup()
{
 
}
Это временные костыли ! Я закомментировал их внутри функции Create, ошибка продолжает возникать.

Могу выслать проект на имаил
Yandex
Объявления
26.01.2013, 02:48     С++ течет при наследовании
Ответ Создать тему
Опции темы

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