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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

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

25.01.2013, 18:27. Просмотров 1922. Ответов 46
Метки нет (Все метки)

Если был создан класс где его поля размещались в стеке (Foo)
и унаследован классом (Foo1) который создается динамически.

Как управиться с памятью? Поможет ли вызов деструктора в деструкторе решить эту проблемму или как делаете вы?
C++
1
2
3
4
~Foo1()
{
~Foo();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2013, 18:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ течет при наследовании (C++):

Использование шаблонов при наследовании, ошибка при компиляции - C++
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

Ошибка при наследовании - C++
Здраствуйте,не могу понять где именно оштбся,возможно кто-то поможет,код прилагаю //#include "stdafx.h" #include <iostream> ...

Ошибка при наследовании - C++
Привет! Ни как не могу разобраться, в чём дело. Создал 2 класса: Base и Derived, где Derived наследует Base. Но при компиляции возникает...

Ошибка при наследовании - C++
Имеется архитектура вида: класс "человек", от него производные "препод" и "член приемной комиссии". От их двоих производный класс "Препод и...

Конструкторы при наследовании - C++
Добрый вечер. Пишу программу с наследованием классов. Класс-родитель - nasled, производный от него - steck. Когда пытаюсь вызвать...

Ошибка при наследовании - C++
Вот такой код: class Figure2 { protected: int Color; int CenterX; int CenterY; public:

46
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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;
}
1
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 еще ну будет начата
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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;
}
1
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 ?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 02:09 #35
Может код map покажете? А то старый уже не актуален из-за исправлений.
1
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;
}


Если есть какие нарекания все учту !
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 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 (точнее после выхода из нее) поизодет ли ошибка?
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:39  [ТС] #38
Croessmah, Да, выбило ошибку программа разламалась в деструкторе !
В деструкторе mytesttmp на выходе из функции (((
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 02:44 #39
Содержимое функций-членов
C++
1
2
    void loadFromFile();
    void BuildCup();
Выложите.
А еще лучше из функции Create уберите вызовы этих функций и посмотрите происходит ли ошибка при выходе из foo
0
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, ошибка продолжает возникать.

Могу выслать проект на имаил
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 02:50 #41
Цитата Сообщение от vbloodv Посмотреть сообщение
C++
1
startMap[9] = red;
Если COUNT_N равен 9, то здесь выход за пределы, потому что индексы от 0 до 8, соответственно, повреждаются данные и результат не предсказуем
1
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.01.2013, 02:51 #42
vbloodv, нумерация с 0, а не с 1
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:53  [ТС] #43
Croessmah,
I.M., но этой функции уже нет в решении, а ошибка продолжает возникать !
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
26.01.2013, 04:22 #44
vbloodv, Вы понимаете, что Map у Вас глобальный? И для него не нужно вызывать деструктор? Или хотя бы зануляйте указатель в декструкторе.
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 04:25  [ТС] #45
Toshkarik, деструктор закомментирован был. Да за сегоднешней дешь выучил
0
26.01.2013, 04:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2013, 04:25
Привет! Вот еще темы с ответами:

Деструктор при наследовании - C++
Имеется 3 класса (базовый -&gt; производный -&gt; производный2) в классе базовый имеется переменная char* var; в производном тоже есть 1...

Конструкторы при наследовании - C++
Описал большую иерархию классов. Надо написать конструкторы, правда уже не очень понимаю как в Си писать конструкторы, к тому же при...

Неоднозначность при наследовании - C++
Привет народ, думаю мой вопрос покажется вам чем-то из разряда &quot;лучше бы делом занялся&quot;, но тех у кого останется терпение, прошу помочь мне...

Сравнение при наследовании - C++
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть...


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

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

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