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

течь памяти из вектора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обработка бинарных файлов http://www.cyberforum.ru/cpp-beginners/thread308602.html
Должны соблюдаться условия: - Размер массива чисел должен вводиться с клавиатуры; - При формировании массива предусмотреть выбор варианта: случайным образом или вводом с клавиатуры; - При выборе...
C++ Игровой автомат делаю игру "игровой автомат" вот код кнопки "Играть" void __fastcall TForm1::Button1Click(TObject *Sender) { int a, b, c, d, e; // a-1 слот b-2 слот c-3 слот d-4 слот e-5 слот a=rand()%7;... http://www.cyberforum.ru/cpp-beginners/thread308598.html
Строки C++
Помогите пожалуйста решить задачку: Имеется литерная последовательность, состоящая из не более чем 50 слов, в каждом из которых от 1 до 8 литер. Слова разделены одним или несколькими знаками % ...
Условие конца файла C++
Имеем функцию: void Inpfile (stud& s) { ifstream base("base.txt"); if(!base)std::cout << "Can't create input file"; base>>s.n; base>>s.fio; base>>s.gr; base>>s.st;...
C++ Error C3861: 'poisson': identifier not found http://www.cyberforum.ru/cpp-beginners/thread308575.html
Помогите, пожалуйста. Нужно зашумить значения синусоидальной последовательности случайной величиной распределенной по з. Пуассона. #include "stdafx.h" #include <iostream> #include <stdio.h>...
C++ Структуры В магазин завезены товары, сведения о которых размещены в двоичном файле структур. Каждая запись файла - структура. Каждая разновидности товара соответствует структура следующего состава: ... подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
30.05.2011, 22:11
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
#include "shape.h" //здесь абстрактный класс фигуры
 
class S //это некий управляющий класс, управляет очередями сообщений заодно и отрисовкой
{
 
public:
vector<shape*> VEC // вектор содержит указатели на фигуры производные от shape - они и перерисовываются по WM_PAINT
 
S(){};
 
~S()
{
for(int i=0;i<VEC.size();i++)
delete VEC[i];
VEC.clear();
};
}
 
 
class curve: public shape
{
public:
vector<shape*> V2;
curve(){};
~curve()
{
for(int i=0;i<V2.size();i++)
delete V2[i];
V2.clear();
}
}
 
 
//привел только деструкторы дабы не громоздить и показать как очищаю векторы
//ниже создание объектов, приведу некую абстрактную функцию.
 
void make()
{
S s;
 
//создание простых фигур через конструкцию switch в ответ на выбор меню, цвета там и пр и
//движение мыши.
// указатели заталкиваюся в вектор класса S после того как левая клавиша отпущена.
shape* figure = new line();
s.VEC.push_back(figure);
shape* figure = new circle();
s.VEC.push_back(figure);
//в конструкторах фигур, координаты, цвет, толщина пера, тип, HRGN полигон(для определения
//пересечений), ничего динамического, ну а ниже собственно создание curve
figure = new curve()// этот конструктор и в реале пустой
//на движение мыши
curve.addsegment() - сюда передаются все параметры как для создания линии, координаты и пр.
//левая клавиша отжата и curve добавляется в общий вектор
s.VEC.push_back(figure)
}
 
curve.addsegment()
{
shape* temp = new line();
V2.push_back(temp);// курва это просто набор простых линий
}
 
//расписывать рисование думаю нет смысла. итак камень преткновения
//при такой схеме все работает, рисуется удаляется, чисто.
//выстрел - летящий круг пересекает регион объекта в векторе и по этому принципу объект
//удаляется из вектора, для простых фигур вполне прокатывает delete s.VEC[i];s.VEC[i]=0;// нет течи
//думаю не совсем верно это поскольку остается пустая ячейка в векторе
// для курвы - и удалял через *iterator, и через delete + erase() ,и через приведение указателя //shape* к curve*, и вызывал //~curve() не советуют так делать (почему?) . деструкторы
//вызываются, все ок, объекты
//уничтожаются, НО на выходе - течь. Стреляешь не в курву - нет течи. А с курвой прям беда.
//
Во-первых, меня смущает:
C++
1
curve.addsegment()
Ведь у тебя указатель. Поэтому figure->addsegment() надо писать.
Во-вторых, у тебя добавляется в вектор и figure для curve, и внутри addsegment() еще создается один динамический объект и тоже добавляется в вектор.
В-третьих, при удалении фигуры, ты память освобождаешь, но из вектора не удаляешь элемент, а просто обнуляешь его.
А потом в деструкторе еще раз вызывается возврат памяти.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru