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

Операция delete в векторе - C++

Восстановить пароль Регистрация
 
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
11.07.2014, 18:38     Операция delete в векторе #1
Привет, друзья, делаю маленькую игрушку, там у меня постоянно появляются и уничтожаются новые объекты, и я заметил такую вещь: со временем игра начинает галить, хотя количество объектов одновременно существующих на экране не становится больше. Что это может быть? Единственное, что приходит в голову - то, что память на самом деле не освобождается после уничтожения объекта, значит я неправильно организовал функцию удаления объекта из вектора?

C++
1
2
3
4
5
6
7
8
9
template<class T>
void DeleteElement(vector<T*> &vec, int i)
{
    if (i < vec.size())
    {
        delete vec[i];
        vec.erase(vec.begin() + i);
    }
}
Если я прав, то как ее переделать? Свап векторов?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2014, 18:38     Операция delete в векторе
Посмотрите здесь:

Поиск в векторе C++
C++ Поиск в векторе
C++ Найти минимальные в векторе
"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
C++ Пары в векторе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Горелый
69 / 43 / 11
Регистрация: 20.03.2014
Сообщений: 173
11.07.2014, 18:51     Операция delete в векторе #2
В этом методе не вижу проблем, возможно у Вас утечки в самом объекте на который указывает указатель, возможно Вы не всё подчищаете в деструкторе этого объекта.
Renji
1533 / 981 / 239
Регистрация: 05.06.2014
Сообщений: 2,950
11.07.2014, 18:58     Операция delete в векторе #3
Для начала заменить vector<T*> на vector<std::unique_ptr<T> >, а вместо DeleteElement использовать векторный erase.
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
11.07.2014, 22:23  [ТС]     Операция delete в векторе #4
Горелый, честно говоря, я еще не разобрался с деструкторами - они у меня пустые..... Подскажи, что написать в деструкторе, например, такого класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Objects
{
public:
    Objects();
    Objects(int x1, int y1, int x2, int y2, FLOAT sz, int sp, D3DXVECTOR2 unVec);
    ~Objects();
    D3DXVECTOR2 position, unitVector, speedVector;
    D3DXVECTOR3 centerPoint;
    RECT spriteRect, borderRect;
    int spriteLength, spriteHeight, speed;
    float size; 
    float angle;
    void SetUnitVector(D3DXVECTOR2 direction);
    void Moove();
    void Drow(float size, float angle);
    void Hit(Objects* object);
protected:
    void CreateSprite();
};
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
12.07.2014, 03:10     Операция delete в векторе #5
Цитата Сообщение от Антон219 Посмотреть сообщение
что написать в деструкторе, например, такого класса
Для начала покажи реализацию конструкторов
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
12.07.2014, 06:13  [ТС]     Операция delete в векторе #6
DrOffset,
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
Objects::Objects(int x1, int y1, int x2, int y2, FLOAT sz, int sp, D3DXVECTOR2 unVec): size(sz), speed(sp), angle(0), unitVector(unVec)
{
    spriteRect = MakeRect (x1, y1, x2, y2);
    spriteLength = spriteRect.right - spriteRect.left;
    spriteHeight = spriteRect.bottom - spriteRect.top;
    centerPoint = D3DXVECTOR3(spriteLength/2, spriteHeight/2, 0);
    D3DXCreateSprite(pDirect3DDevice, &sprite);
}
Bullet::Bullet(int x1, int y1, int x2, int y2, FLOAT sz, int sp, string str, Objects* obj, D3DXVECTOR2 unVec): Objects (x1, y1, x2, y2, sz, sp, unVec), bulletBonus(str)
{
    position = obj->position;
    unitVector = D3DXVECTOR2(1.0f, 0.0f);
    borderRect = MakeRect (position.x - size*spriteLength/2, position.y - size*spriteHeight/2, position.x + size*spriteLength/2, position.y + size*spriteHeight/2);
}
BulletShrapnel::BulletShrapnel(Objects* obj): Bullet (450, 53, 477, 70, 0.5f, 25, "BulletShrapnel",  obj, D3DXVECTOR2(1.0f, 0.0f))
{
    emountBulletContain = shipVec[0]->GetShrapnelNumber();
}
Meteors::Meteors(int x1, int y1, int x2, int y2): Objects(x1, y1, x2, y2, (rand() % 4 + 3) * 0.1f, rand() % 4 + 1, D3DXVECTOR2(-1.0f, 0.0f))
{
    position = D3DXVECTOR2(800.0f, rand() % 505 + 25.0f);
    unitVector = D3DXVECTOR2(-1.0f, 0.0f);
    CreateSprite();
}
RollingMeteors::RollingMeteors(): Meteors(0, 260, 103, 348)/* (rand() % 5 + 2) * 0.1f, rand() % 4 + 1, D3DXVECTOR2(-1.0f, 0.0f))*/, rollSpeed(rand() % 4 + 1) 
{
    borderRect = MakeRect (position.x - size*spriteLength/2, position.y - size*spriteHeight/2, position.x + size*spriteLength/2, position.y + size*spriteHeight/2);
}
AnimatedMeteors::AnimatedMeteors():Meteors(0, 135, 102, 230)
{
    frame = 0;
    borderRect = MakeRect (position.x - size*spriteLength/2, position.y - size*spriteHeight/2, position.x + size*spriteLength/2, position.y + size*spriteHeight/2);
}
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
12.07.2014, 06:54     Операция delete в векторе #7
Цитата Сообщение от Антон219 Посмотреть сообщение
Единственное, что приходит в голову - то, что память на самом деле не освобождается после уничтожения объекта
Это элементарно проверяется vmmap

http://technet.microsoft.com/en-us/s.../dd535533.aspx
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.07.2014, 10:35     Операция delete в векторе #8
Антон219, деструктор Objects следует сделать виртуальным, если используется полиморфное удаление.
P.s. В исходном коде нет проверки на отрицательность индекса.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
13.07.2014, 15:33     Операция delete в векторе #9
Антон219, а MakeRect что делает?
Короче тут правило-то простое, если ты в конструкторе захватил какой-то ресурс, то в деструкторе он освобождается. Это происходит либо автоматически, если ресурс - это тоже какой-то класс со своим деструктором. Либо придется вызвать какую-то функцию, освобождения (из деструктора). Так что теперь смотри что ты делаешь в конструкторах, есть ли там такие ресурсы, которые требуют освобождения и нужно ли его делать вручную, и в зависимости от этого пишешь или не пишешь деструктор.
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
28.07.2014, 23:44  [ТС]     Операция delete в векторе #10
DrOffset, я разобрался с глюками, там все было просто). Вопрос насчет деструкторов тогда такой: если у меня в конструкторе просто инициализируются, например пара int переменных, то ведь они автоматически уйдут при уничтожении объекта? Но, например, в одном из конструкторов у меня вектор указателей данного класса заполняется данными. Тогда в деструкторе надо этот вектор освободить? Что-то вроде этого ты имел ввиду?
P.S.:
C++
1
2
3
4
5
6
7
8
9
RECT MakeRect( long x1, long y1, long x2, long y2)
{
    RECT rect;
    rect.left   = x1;
    rect.top    = y1;
    rect.right  = x2;
    rect.bottom = y2;
    return rect;
}
Добавлено через 43 секунды
Tulosba,
Цитата Сообщение от Tulosba Посмотреть сообщение
P.s. В исходном коде нет проверки на отрицательность индекса
Поясни, пожалуйста, о каких символах ты говоришь
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
29.07.2014, 00:07     Операция delete в векторе #11
Цитата Сообщение от Антон219 Посмотреть сообщение
если у меня в конструкторе просто инициализируются, например пара int переменных, то ведь они автоматически уйдут при уничтожении объекта?
Да.
Цитата Сообщение от Антон219 Посмотреть сообщение
Но, например, в одном из конструкторов у меня вектор указателей данного класса заполняется данными. Тогда в деструкторе надо этот вектор освободить?
Если память выделялась через new, а потом эти указатели записывались в вектор в конструкторе, то в деструкторе надо будет пройтись по элементам вектора и вызвать для каждого delete. Ну это в первом приближении, если я правильно понял твой вопрос.

А вот постскриптум твой я не понял. Это к чему?
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
29.07.2014, 00:29  [ТС]     Операция delete в векторе #12
Да, я это и имел ввиду! Спасибо. А посскриптум- ты просто спросил, что делает MakeRect
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
29.07.2014, 00:44     Операция delete в векторе #13
Антон219, что бы не путаться больше,почитай про виды памяти в с++ и время жизни объектов.
Это напрямую касается твоего вопроса
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
29.07.2014, 07:29     Операция delete в векторе #14
Антон219, если i будет <0, получишь UB.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2014, 17:34     Операция delete в векторе
Еще ссылки по теме:

delete[] *pointer vs. delete pointer и утечка памяти C++
C++ Структуры в векторе
C++ N-мерный массив в векторе

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

Или воспользуйтесь поиском по форуму:
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 68
04.08.2014, 17:34  [ТС]     Операция delete в векторе #15
Tulosba, а вот это исправит дело?
C++
1
2
3
4
5
6
7
8
9
template<class T>
void DeleteElement(vector<T*> &vec, unsigned int i)
{
    if (i < vec.size())
    {
        delete vec[i];
        vec.erase(vec.begin() + i);
    }
}
добавил unsigned к параметру
Yandex
Объявления
04.08.2014, 17:34     Операция delete в векторе
Ответ Создать тему
Опции темы

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