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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
#1

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2014, 18:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Операция delete в векторе (C++):

Недопустимая операция при выполнении оператора delete[] - C++
Проблема у меня такая. Есть функция. Кусок ее кода выглядит примерно так: //... получам M и N float *pArr1 = new float ; int *pArr2 =...

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

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

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

Пары в векторе - C++
Задан вектор в 200 чисел который рандомно заполнен в диапазоне от -50 до 50 . Нужно из этого безобразия получить количество отрицательных и...

14
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 186
11.07.2014, 18:51 #2
В этом методе не вижу проблем, возможно у Вас утечки в самом объекте на который указывает указатель, возможно Вы не всё подчищаете в деструкторе этого объекта.
1
Renji
2014 / 1382 / 312
Регистрация: 05.06.2014
Сообщений: 3,942
11.07.2014, 18:58 #3
Для начала заменить vector<T*> на vector<std::unique_ptr<T> >, а вместо DeleteElement использовать векторный erase.
2
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
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
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
12.07.2014, 03:10 #5
Цитата Сообщение от Антон219 Посмотреть сообщение
что написать в деструкторе, например, такого класса
Для начала покажи реализацию конструкторов
1
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
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
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
12.07.2014, 06:54 #7
Цитата Сообщение от Антон219 Посмотреть сообщение
Единственное, что приходит в голову - то, что память на самом деле не освобождается после уничтожения объекта
Это элементарно проверяется vmmap

http://technet.microsoft.com/en-us/sysinternals/dd535533.aspx
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
13.07.2014, 10:35 #8
Антон219, деструктор Objects следует сделать виртуальным, если используется полиморфное удаление.
P.s. В исходном коде нет проверки на отрицательность индекса.
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2014, 15:33 #9
Антон219, а MakeRect что делает?
Короче тут правило-то простое, если ты в конструкторе захватил какой-то ресурс, то в деструкторе он освобождается. Это происходит либо автоматически, если ресурс - это тоже какой-то класс со своим деструктором. Либо придется вызвать какую-то функцию, освобождения (из деструктора). Так что теперь смотри что ты делаешь в конструкторах, есть ли там такие ресурсы, которые требуют освобождения и нужно ли его делать вручную, и в зависимости от этого пишешь или не пишешь деструктор.
1
Антон219
0 / 0 / 0
Регистрация: 09.06.2013
Сообщений: 71
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
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
29.07.2014, 00:07 #11
Цитата Сообщение от Антон219 Посмотреть сообщение
если у меня в конструкторе просто инициализируются, например пара int переменных, то ведь они автоматически уйдут при уничтожении объекта?
Да.
Цитата Сообщение от Антон219 Посмотреть сообщение
Но, например, в одном из конструкторов у меня вектор указателей данного класса заполняется данными. Тогда в деструкторе надо этот вектор освободить?
Если память выделялась через new, а потом эти указатели записывались в вектор в конструкторе, то в деструкторе надо будет пройтись по элементам вектора и вызвать для каждого delete. Ну это в первом приближении, если я правильно понял твой вопрос.

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

Структуры в векторе - C++
struct Node { char ch; int parent; int zero; int one; bool branch; } ; ...

Поиск в векторе - C++
Есть вектор v: v = 0; v = 1; v = 2; v = 4; v = 6; Как с помощью алгоритма find узнать есть ли в векторе число 8, между...

Поиск в векторе - C++
Есть вектор v Нужно задать поиск значения 6 и присвоить переменной i номер элемента вектора v, в котором найдена искомое значение 6. В...

Сортировка в векторе - C++
Нужно отсортировать студентов в векторе по размеру стипендии от большей к меньшей. Для этого у меня есть френд функция в классе но как...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.