Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314

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

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

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

Как управиться с памятью? Поможет ли вызов деструктора в деструкторе решить эту проблемму или как делаете вы?
C++
1
2
3
4
~Foo1()
{
~Foo();
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2013, 18:27
Ответы с готовыми решениями:

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

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

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

46
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
25.01.2013, 23:55  [ТС]
Студворк — интернет-сервис помощи студентам
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();?
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
26.01.2013, 00:06
Цитата Сообщение от vbloodv Посмотреть сообщение
правильно удалять list через ~list() и вектор через ~vector();
Неправильно, деструкторы на то и придуманы, чтобы вызываться автоматически. Если вызвать деструктор самостоятельно - то по сути он будет вызван дважды. Пожалуй единственный случай, когда явный вызов деструктора имеет смысл - использование placement new.
1
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:32  [ТС]
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 ?
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
26.01.2013, 00:33
Цитата Сообщение от vbloodv Посмотреть сообщение
показывает утечки
В последнем коде вроде больше нет выделения памяти.

Добавлено через 20 секунд
Если cups удаляешь.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.01.2013, 00:38
Цитата Сообщение от 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, объявленный в конструкторе - разные сущности
1
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
26.01.2013, 00:40
Цитата Сообщение от vbloodv Посмотреть сообщение
если заменяю
Программирование подбором? Правила то простые - если сделал new - сделай delete, аналогично с new[]/delete[]. А лучше, как уже не раз здесь писали, пользоваться умными указателями и вообще не иметь головной боли с управлением ресурсами. Возможно HGE требует деинициализации.

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

Не по теме:

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

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

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

Не по теме:

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

1
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:52  [ТС]
Croessmah, gray_fox, Я могу инициализацию член именно поле класса?
Вроде бы поля только статические можно инициализировать, а в конструкторе если только через this...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.01.2013, 00:53
Цитата Сообщение от 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
1
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 00:58  [ТС]
Croessmah, Мне стыдно только что new[] в msdn прочитал. Напутал в синтаксисе и думал высокие материи...
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
26.01.2013, 01:01
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
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 01:14  [ТС]
Цитата Сообщение от 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
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
26.01.2013, 01:15
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
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:05  [ТС]
Не все просто у меня получается:

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

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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.01.2013, 02:09
Может код map покажете? А то старый уже не актуален из-за исправлений.
1
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:14  [ТС]
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.01.2013, 02:30
добавьте функцию в 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
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:39  [ТС]
Croessmah, Да, выбило ошибку программа разламалась в деструкторе !
В деструкторе mytesttmp на выходе из функции (((
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
26.01.2013, 02:44
Содержимое функций-членов
C++
1
2
    void loadFromFile();
    void BuildCup();
Выложите.
А еще лучше из функции Create уберите вызовы этих функций и посмотрите происходит ли ошибка при выходе из foo
0
 Аватар для vbloodv
23 / 23 / 3
Регистрация: 15.12.2012
Сообщений: 314
26.01.2013, 02:48  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2013, 02:48
Помогаю со студенческими работами здесь

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

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

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

Ошибка при наследовании
Имеется архитектура вида: класс &quot;человек&quot;, от него производные &quot;препод&quot; и &quot;член приемной комиссии&quot;. От их двоих производный класс...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru