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

Удаление вектора из области динамической памяти. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.85
chiralastra
0 / 0 / 0
Регистрация: 13.07.2011
Сообщений: 3
13.07.2011, 01:19     Удаление вектора из области динамической памяти. #1
Всем привет!

Прошу разъяснить. Как правильно удалить содержимое вектора?

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
class Coordinate
{
public:
    Coordinate() {}
    int *getCoord() 
    {   return itsCoord;    }
    void setCoord( int i)
    {
        itsCoord[0]=i*2;
        itsCoord[1]=i*3;
    }
 
private:
    int itsCoord[2];
};
 
int main()
{
    vector <Coordinate*> paddles;
 
    for (int i=0; i < 10; i++)
        {
            paddles.push_back( new Coordinate );
            paddles[i]->setCoord(i);
        }   
    
    return 0;
}
C++
1
delete [] paddles
не помогает.

Спасибо за внимание.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.07.2011, 01:24     Удаление вектора из области динамической памяти. #2
через итератор
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
#include <vector>
#include <iostream>
 
class Coordinate
{
public:
    Coordinate() 
    {}
    
    ~Coordinate()
    {
        std::cout << "del\n";
    }
 
    int* getCoord() 
    {
        return itsCoord;        
    }
        
    void setCoord(int i)
    {
        itsCoord[0] = i * 2;
        itsCoord[1] = i * 3;
    }
private:
        int itsCoord[2];
};
 
int main()
{
    std::vector <Coordinate*> paddles;
    for (int i = 0; i < 10; ++i)
    {
        paddles.push_back(new Coordinate());
        paddles[i]->setCoord(i);
    }       
    std::vector<Coordinate*>::iterator ib = paddles.begin(),
                                       ie = paddles.end();
    for (; ib != ie; ++ib)
    {
        delete *ib;
    }
    return 0;
}
Daemon025
 Аватар для Daemon025
380 / 329 / 67
Регистрация: 06.12.2010
Сообщений: 900
13.07.2011, 01:27     Удаление вектора из области динамической памяти. #3
C++
1
2
3
4
5
6
7
8
typedef std::vector<int> Vec;
...
Vec* pVec = new Vec;
или
shared_ptr<Vec> pVec = shared_ptr<Vec>(new Vec);
 
.....
delete pVec;
chiralastra
0 / 0 / 0
Регистрация: 13.07.2011
Сообщений: 3
13.07.2011, 01:31  [ТС]     Удаление вектора из области динамической памяти. #4
вроде
C++
1
2
for (int i=0; i<paddles.size(); i++) 
delete [] paddles[i]
?

ты это имеешь в виду?

Добавлено через 1 минуту
Цитата Сообщение от Daemon025 Посмотреть сообщение
C++
1
2
3
4
5
typedef std::vector<int> Vec;
...
Vec* pVec = new Vec;
или
shared_ptr<Vec> pVec = shared_ptr<Vec>(new Vec);
не понял а удалять то как?

Добавлено через 1 минуту
Цитата Сообщение от Maxwe11 Посмотреть сообщение
через итератор
C++
1
2
3
4
5
6
    std::vector<Coordinate*>::iterator ib = paddles.begin(),
                                       ie = paddles.end();
    for (; ib != ie; ++ib)
    {
        delete *ib;
    }
Большое спасибо
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.07.2011, 01:31     Удаление вектора из области динамической памяти. #5
Цитата Сообщение от chiralastra Посмотреть сообщение
не понял а удалять то как?
это немного не то, смотри мой пример
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
13.07.2011, 02:26     Удаление вектора из области динамической памяти. #6
я просто через цикл удалял, вроде проблем не было.
C++
1
2
        for (int i=0; i<10; i++)
            delete paddles[i];
только единственное , потом надо resize делать
C++
1
        paddles.resize(0);
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.07.2011, 02:30     Удаление вектора из области динамической памяти. #7
Цитата Сообщение от Maxwe11 Посмотреть сообщение
C++
1
2
3
4
int* getCoord() 
{ 
    return itsCoord; 
}
Какое-то очень смелое решение...
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.07.2011, 02:32     Удаление вектора из области динамической памяти. #8
Цитата Сообщение от easybudda Посмотреть сообщение
Какое-то очень смелое решение...
невсматривался) скопипастил код ТС и прогнал через форматирующую код прогу)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.07.2011, 02:44     Удаление вектора из области динамической памяти. #9
Maxwe11, ну это не лично к Вам, это просто замечание, что не нужно так делать... Пример:
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
#include <iostream>
 
class WrongClass {
    int * arr;
public:
    WrongClass() {
        arr = new int [ 2 ];
        arr[0] = 1;
        arr[1] = 2;
    }
    ~WrongClass(){
        delete [] arr;
    }
    int * GetPtr(){
        return arr;
    }
};
 
int main(){
    int * ptr;
    bool someBoolean = true;
    /* somewhere in code */
    if ( someBoolean ) {
        WrongClass wc;
        ptr = wc.GetPtr();
        std::cout << ptr[0] << ' ' << ptr[1] << std::endl;
    }
    std::cout << ptr[0] << ' ' << ptr[1] << std::endl; // и что вывестись должно? объекта wc уже не существует
        // и указатель непонятно, куда указывает
    
    return 100500;
}
Мелкомягкий компилятор проглотил, не ойкнул. А в итоге - генератор случайных чисел...
Код
C:\cpp\shitcode>cl WrongClass.cpp /EHsc
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 16.00.30319.01
 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

WrongClass.cpp
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:WrongClass.exe
WrongClass.obj

C:\cpp\shitcode>WrongClass.exe
1 2
5315880 5308612

C:\cpp\shitcode>
chiralastra
0 / 0 / 0
Регистрация: 13.07.2011
Сообщений: 3
13.07.2011, 14:52  [ТС]     Удаление вектора из области динамической памяти. #10
easybudda тогда, если не сложно, подскажите как лучше вызывать массив из класса?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.07.2011, 15:06     Удаление вектора из области динамической памяти. #11
chiralastra, либо создавать копию массива и возвращать на неё указатель, тогда очищать память прийдётся самостоятельно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass {
//...
    int * GetArray(){
        int * ret = new int[2];
        ret[0] = arr[0];
        ret[1] = arr[1];
        return ret;
    }
};
 
// где-то в программе
MyClass mc;
int * ptr = mc.GetArray();
//...
delete [] ptr;
либо передавать функции буфер, достаточный для хранения массива
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyClass {
//...
    void GetArray(int * buf){
        buf[0] = arr[0];
        buf[1] = arr[1];
    }
};
 
// где-то в программе
MyClass mc;
int * ptr = new int [2];
mc.GetArray(ptr);
//...
delete [] ptr;
Но это очень грубо, в реале нужно ещё много всяких танцев с бубном, чтобы это можно было назвать классом... Кстати, копировать массивы без крайней на то необходимости - вообще не очень хорошая затея. Ладно, когда там два элемента... А в общем случае лучше всю конструкцию пересмотреть. Опять же, не зная, зачем Вам это, только гадать приходится, как лучше / как хуже...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
14.07.2011, 12:28     Удаление вектора из области динамической памяти. #12
chiralastra, лучше хранить координаты в std::vector и возвращать его копию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2011, 22:23     Удаление вектора из области динамической памяти.
Еще ссылки по теме:

C++ Выделение динамической памяти
C++ Удаление динамической памяти
Динамические массивы создаются в динамической области памяти с использованием операций NEW и DELETE C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.07.2011, 22:23     Удаление вектора из области динамической памяти. #13
Коль скоро в классе нет указателей, указывающих на динамически выделенные области памяти, то обнуляй вектор да и дело с концом.
Yandex
Объявления
14.07.2011, 22:23     Удаление вектора из области динамической памяти.
Ответ Создать тему
Опции темы

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