Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
1

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

11.07.2014, 18:38. Показов 1523. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, друзья, делаю маленькую игрушку, там у меня постоянно появляются и уничтожаются новые объекты, и я заметил такую вещь: со временем игра начинает галить, хотя количество объектов одновременно существующих на экране не становится больше. Что это может быть? Единственное, что приходит в голову - то, что память на самом деле не освобождается после уничтожения объекта, значит я неправильно организовал функцию удаления объекта из вектора?

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);
    }
}
Если я прав, то как ее переделать? Свап векторов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2014, 18:38
Ответы с готовыми решениями:

Недопустимая операция при выполнении оператора delete[]
Проблема у меня такая. Есть функция. Кусок ее кода выглядит примерно так: //... получам M и N...

Операция delete вызывает ошибку Access violation at address
Доброго времени суток, уважаемые форумчане! Компьютер HP omnibook xe4100, Mobile Intel Celeron...

Операция ON DELETE
Добрый день мне нужна ваша помощь в создании БД &quot;Автосалон&quot;, хотя по сути конкретно тема не нужна...

PostgresSQL + Hibernate (many-to-many, annotation) - операция delete
всем привет! все переискал, перепробовал различные виды каскадов, но безрезультатно. не могу...

14
130 / 70 / 25
Регистрация: 20.03.2014
Сообщений: 261
11.07.2014, 18:51 2
В этом методе не вижу проблем, возможно у Вас утечки в самом объекте на который указывает указатель, возможно Вы не всё подчищаете в деструкторе этого объекта.
1
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
11.07.2014, 18:58 3
Для начала заменить vector<T*> на vector<std::unique_ptr<T> >, а вместо DeleteElement использовать векторный erase.
2
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
11.07.2014, 22:23  [ТС] 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();
};
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
12.07.2014, 03:10 5
Цитата Сообщение от Антон219 Посмотреть сообщение
что написать в деструкторе, например, такого класса
Для начала покажи реализацию конструкторов
1
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
12.07.2014, 06:13  [ТС] 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);
}
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
12.07.2014, 06:54 7
Цитата Сообщение от Антон219 Посмотреть сообщение
Единственное, что приходит в голову - то, что память на самом деле не освобождается после уничтожения объекта
Это элементарно проверяется vmmap

http://technet.microsoft.com/e... 35533.aspx
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.07.2014, 10:35 8
Антон219, деструктор Objects следует сделать виртуальным, если используется полиморфное удаление.
P.s. В исходном коде нет проверки на отрицательность индекса.
1
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
13.07.2014, 15:33 9
Антон219, а MakeRect что делает?
Короче тут правило-то простое, если ты в конструкторе захватил какой-то ресурс, то в деструкторе он освобождается. Это происходит либо автоматически, если ресурс - это тоже какой-то класс со своим деструктором. Либо придется вызвать какую-то функцию, освобождения (из деструктора). Так что теперь смотри что ты делаешь в конструкторах, есть ли там такие ресурсы, которые требуют освобождения и нужно ли его делать вручную, и в зависимости от этого пишешь или не пишешь деструктор.
1
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
28.07.2014, 23:44  [ТС] 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. В исходном коде нет проверки на отрицательность индекса
Поясни, пожалуйста, о каких символах ты говоришь
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
29.07.2014, 00:07 11
Цитата Сообщение от Антон219 Посмотреть сообщение
если у меня в конструкторе просто инициализируются, например пара int переменных, то ведь они автоматически уйдут при уничтожении объекта?
Да.
Цитата Сообщение от Антон219 Посмотреть сообщение
Но, например, в одном из конструкторов у меня вектор указателей данного класса заполняется данными. Тогда в деструкторе надо этот вектор освободить?
Если память выделялась через new, а потом эти указатели записывались в вектор в конструкторе, то в деструкторе надо будет пройтись по элементам вектора и вызвать для каждого delete. Ну это в первом приближении, если я правильно понял твой вопрос.

А вот постскриптум твой я не понял. Это к чему?
1
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
29.07.2014, 00:29  [ТС] 12
Да, я это и имел ввиду! Спасибо. А посскриптум- ты просто спросил, что делает MakeRect
0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
29.07.2014, 00:44 13
Антон219, что бы не путаться больше,почитай про виды памяти в с++ и время жизни объектов.
Это напрямую касается твоего вопроса
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.07.2014, 07:29 14
Антон219, если i будет <0, получишь UB.
1
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 72
04.08.2014, 17:34  [ТС] 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 к параметру
0
04.08.2014, 17:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2014, 17:34
Помогаю со студенческими работами здесь

Почему операция DELETE FROM... работает только в GUI, а не в консольном варианте
Если запустить приложнение как консольное и выполнить операцию DELETE к БД через jdbc, то почему то...

Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться
Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться. кто сможет?...

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если...

Какая разница между delete и delete[]
Нашел информацию на разных сайтах и всё равно остались вопросы. Я понимаю, что delete используется...

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete...

Чем отличается delete[] от delete?
чем отличается? delete mas от delete mas


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru