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

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

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

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

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

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

удаление указателей - C++
Я создал указатель и выделил память vector < vector <Obj> > *p_L = new vector< vector <Obj> >; Как мне теперь освободить...

Удаление указателей на C++ - C++
#include <iostream> using namespace std; class Induct { public: void Set(int a) { x=a;

Применение и удаление указателей - C++
Здравствуйте. Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти. Есть указатель: int...

Удаление списка указателей - C++
Здорова! Есть задачка: Определите список указателей, который уничтожает объекты, адресуемые этими указателями, во время уничтожения...

Удаление указателей из вектора - C++
Что то голова совсем не варит под вечер, подскажите, вот есть у меня вектор хранящий указатели на объекты, ежли я вызову erase насколько...

5
Igor3D
915 / 514 / 55
Регистрация: 01.10.2012
Сообщений: 2,547
13.01.2013, 19:47 #2
Цитата Сообщение от Чистый Посмотреть сообщение
C++
1
2
3
4
void clear_list()
{
 delete [] test::list;
}
Так Вы освободите память занимаемую указателями. Однако если элементы были созданы в куче (напр с помощью new) то они не будут удалены. В этом случае надо перед удалением пройтись в цикле и сделать delete каждого указателя. Если есть наследование то базовый класс должен иметь деструктор объявленный virtual
0
Чистый
Автор FAQ
2708 / 1404 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 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
0
Igor3D
915 / 514 / 55
Регистрация: 01.10.2012
Сообщений: 2,547
13.01.2013, 20:18 #4
Не ошибка, но смысла немного, только вышли из ф-ции - и все пропало, остаетесь с массивом невалидных указателей. Лучше оформить static метод, напр

C++
1
void mesto::FreeAll( bool delPtr );
1
Чистый
Автор FAQ
2708 / 1404 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 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?
0
Igor3D
915 / 514 / 55
Регистрация: 01.10.2012
Сообщений: 2,547
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. Ну то уже "тонкости архитектуры"
1
14.01.2013, 11:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 11:00
Привет! Вот еще темы с ответами:

Удаление содержимого указателей, хранящихся в векторе - C++
Здравствуйте! Меня озадачила одна проблема: допустим у нас есть вектор указателей, ссылающихся на класс А: vector&lt;A*&gt; va; Мы его...

Массив указателей на массив строк и сортировка массива указателей - C++
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...

Сортировка массива структур через сортировку массива указателей - C++
Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто видит ошибку - помогите, пожалуйста. Код программы: ...

Инициализация массива указателей С++11 - C++
Нативный вопрос, хочу инициализировать массив указателей нулями, раньше так делал через цикл. Сейчас читаю о возможностях С++11 и наткнулся...


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

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

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