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

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

25.01.2013, 18:27. Показов 4024. Ответов 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
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru