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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Чистый
Автор FAQ
2692 / 1388 / 71
Регистрация: 08.09.2011
Сообщений: 3,714
Записей в блоге: 1
#1

Удаление массива указателей - C++

13.01.2013, 19:13. Просмотров 2530. Ответов 5
Метки нет (Все метки)

есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class test
{
private:
    static test **list;
static int count_object;
public:
void mesto::Add()
{
    this->list[count_object]=this;
    count_object++;
}
};
затем я выделяю под него память:
C++
1
2
test ** test::list = new test *[100];
int test::count_object=0;
от класса test наследуются др классы и все они через функцию Add () добавляют сами себя в статический массив list, как мне теперь удалить правильно этот массив? Пробовал так:
C++
1
delete [] test::list;
но получаю ошибку:
'test** test::list' is private
при этом препод сказал что list должен быть приватным, получается что для его удаления надо просто сделать метод который подчистит ? Что то подобное вот этому? :
C++
1
2
3
4
void clear_list()
{
 delete [] test::list;
}
правильно ли я все понял, и правильно ли я создал массив указателей на объекты классов? Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 19:13     Удаление массива указателей
Посмотрите здесь:

C++ Программирование массива указателей
Вызов функции массива указателей C++
Создание массива указателей на векторы C++
Удаление указателей из вектора C++
C++ удаление указателей
C++ Разыменовывание массива указателей
удаление списка указателей C++
Применение и удаление указателей C++
C++ Удаление указателей на C++
C++ Связь массива и указателей
C++ Переворот массива с помощью указателей
Рисунок в C++ с использованием массива и указателей C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Igor3D
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,300
13.01.2013, 19:47     Удаление массива указателей #2
Цитата Сообщение от Чистый Посмотреть сообщение
C++
1
2
3
4
void clear_list()
{
 delete [] test::list;
}
Так Вы освободите память занимаемую указателями. Однако если элементы были созданы в куче (напр с помощью new) то они не будут удалены. В этом случае надо перед удалением пройтись в цикле и сделать delete каждого указателя. Если есть наследование то базовый класс должен иметь деструктор объявленный virtual
Чистый
Автор FAQ
2692 / 1388 / 71
Регистрация: 08.09.2011
Сообщений: 3,714
Записей в блоге: 1
13.01.2013, 20:01  [ТС]     Удаление массива указателей #3
test содержит деструктор:

C++
1
virtual ~test();
но в нем я только удалил private поля под которые выделял память через new

вот main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    test mst("Europe", 0.99, 5.55);
    mst.Add();
 
    test_1 obl("Brestskaya", "Belarus");
    obl.Add();
 
    test_2 ct("Brest", "East", false);
    ct.Add();
 
    test_3 Mct("Minsk", "Yrych'e", true, 53.9, 27.57);
    Mct.Add();
 
    mesto::showList();
   // delete [] mesto::list;
    return 0;
}
test_1 и test_2 унаследованы от test, test_3 от test_2
Igor3D
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,300
13.01.2013, 20:18     Удаление массива указателей #4
Не ошибка, но смысла немного, только вышли из ф-ции - и все пропало, остаетесь с массивом невалидных указателей. Лучше оформить static метод, напр

C++
1
void mesto::FreeAll( bool delPtr );
Чистый
Автор FAQ
2692 / 1388 / 71
Регистрация: 08.09.2011
Сообщений: 3,714
Записей в блоге: 1
13.01.2013, 20:39  [ТС]     Удаление массива указателей #5
а что во в статической FreeAll писать ?
что то подобное:
C++
1
2
3
for(int i=0; i<count_object; ++i)
{    delete list[i];}
delete [] list
и FreeAll поместить в public?
Igor3D
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,300
14.01.2013, 11:00     Удаление массива указателей #6
Цитата Сообщение от Чистый Посмотреть сообщение
а что во в статической FreeAll писать ?
что то подобное:
Да, может добавить if
C++
1
2
3
4
if (delPtr)
 for(int i=0; i<count_object; ++i)
   delete list[i];
delete [] list
Чтобы работало как для объектов в куче (delPtr = true) так и для объектов на стеке, как в Вашем примере.
Если подходить строго, "по всем правилам", то list должен быть списком, а не массивом. Деструктор базового типа должен удалять указатель из списка. А сейчас если объект будет удален, то невалидный указатель остается в list. Ну то уже "тонкости архитектуры"
Yandex
Объявления
14.01.2013, 11:00     Удаление массива указателей
Ответ Создать тему
Опции темы

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