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

Как удалить несколько указателей?

26.03.2017, 18:01. Показов 1699. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Суть вопроса: Есть 9 указателей созданного класса, в них записано с помощью оператора new данные. Так же есть массив указателей куда записан каждый этот указатель . Вопрос: как лучше их все удалить? Пытался удалить каждый элемент в массиве for(int i=0;i<9;i++){ delete [i]*arr} но был Вызов точки остановы. Или если удалять каждый указатель, то delete first,second,third.. но удалился только первый. Вывод сделал что удалять перечислением нельзя( Подскажите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2017, 18:01
Ответы с готовыми решениями:

Как удалить массив указателей char*
Столкнулся с проблемой при написании деструктора к классу, а именно не получается корректно удалить...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Удалить первичные вхождения с использованием указателей
Переделайте код пожалуйста, что бы в нем использовались указатели. Удалить из массива все...

Массив указателей на строки: удалить последнюю строку
Помогите пожалуйста...суть задания: создать массив указателей на строки , разработать процедуру,...

8
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
26.03.2017, 18:05 2
C++
1
2
3
int *arr[9];
//...
for(int i=0; i<9 ;i++) delete arr[i];
0
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
26.03.2017, 18:18  [ТС] 3
Точно)) Спасибо. А вот если бы массива не было? Но есть 9 указателей, каждому писать delete?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.03.2017, 18:22 4
Цитата Сообщение от Nubila Посмотреть сообщение
А вот если бы массива не было? Но есть 9 указателей
А покажите код - я подозреваю, что вы спрашиваете про гавнокод
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
26.03.2017, 18:23 5
Цитата Сообщение от Nubila Посмотреть сообщение
Так же есть массив указателей куда записан каждый этот указатель . Вопрос: как лучше их все удалить?
std::unique_ptr в помощь, он сам все удалит, когда будет прибит массив в котором он лежит.
0
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
26.03.2017, 22:27  [ТС] 6
Без проблем. Обычное задание- Игра Крестики-Нолики. Суть такова:есть абстрактный класс, и от него 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
class Symbol //абстрактный класс
{
    static int Count;//переменная для подсчёта кол-ва всех объектов
public:
    Symbol() //конструктор по умолчанию
    {
        Count++;
    }
    virtual ~Symbol()
    {}
    virtual void DrawSym()const = 0 {} //чистая виртуальная функция 
    virtual int GetPersCount() const //виртуальный метод, служащий для возврата кол-ва обьектов класса
    {
        cout << "Error Call" << endl;
        return 0;
    }
    int GetPosition1() const
    {
        return Position[0];
    }
    int GetPosition2() const
    {
        return Position[1];
    }
    static int &GetCount()
    {
        return Count;
    }
protected:
    int Position[2];
};
class Zero : public Symbol //производный класс
{
    static char Name[16]; //символьная строка , записывающая имя пользователя выбравшего игру за нули
public:
    Zero(int *pos)
    {
        Position[0] = pos[0];
        Position[1] = pos[1];
        CountZ++;
    }
    ~Zero() {}
    void DrawSym() const //замещённая виртуальная функция отрисовки объекта
    {
        gotoxy(Position[0] + 6, Position[1]);
        SetColor(13);
        cout << "00000000000000000000" << endl;
        for (int i = 1; i <= 12; i++)
        {
            gotoxy(Position[0] + 5, Position[1] + i);
            cout << "000                000" << endl;
        }
        gotoxy(Position[0] + 6, Position[1] + 13);
        cout << "00000000000000000000" << endl;
        SetColor(8);
    }
    int GetPersCount() const //замещённый виртуальный метод возврата кол-ва объектов
    {
        return CountZ;
    }
    static char* GetName()
    {
        return Name;
    }
    static int CountZ;// переменная для подсчёта кол-ва обьектов данного класса
};
class Cross : public Symbol //второй производный класс идентичен первому , разница лишь в визуальных аспектах
{
static char Name[16];
public:
    Cross(int *pos)
    {
        Position[0] = pos[0];
        Position[1] = pos[1];
        CountC++;
    }
    ~Cross() {}
    void DrawSym() const
    {
        SetColor(6);
        for (int i = 1, j = 15; i < 15; i++, j--)
        {
            gotoxy(Position[0] + i + 5, Position[1] + i - 1);
            cout << "XXXXXX";
            gotoxy(Position[0] + j + 5, Position[1] + i - 1);
            cout << "XXXXXX";
        }
        cout << endl;
        SetColor(7);
    }
    int GetPersCount() const
    {
        return CountC;
    }
    static char* GetName() 
    {
        return Name;
    }
    static int CountC;
};
char Cross::Name[16] = "000000000000000"; 
char Zero::Name[16] = "000000000000000";
int Symbol::Count = 0;
int Zero::CountZ = 0;
int Cross::CountC = 0;
Symlob *first,*second,*third,*four,*five,*six,*seven,*eight,*nine;
Symbol *masZ[5];
Symbol *masC[5];
Symbol *mass[9];
void main()
{ //разного рода действия
  for (int i = 0; i<9; i++)
        delete mass[i];
    if (FinalArrow()) //выбор стрелками 
            goto M1;
    else
            goto M0;
}
Вопросы всё же ещё остались. 1) Удаление всех объектов происходит в конце main'a(весь мэйн достаточно громоздкий, и сюда я бы не хотел его тулить) , так как в конце игры вопрос будет стоять о повторе игры(тобиш самого мэйна), то я удалил все обьекты и обнулил их а затем использовал Goto и метку в начале , но указатели были не нулевыми и уже имели большие отрицательные числа в переменных-членах... подозреваю что это связано с тем что они были объявлены как глобальные и что то пошло не так. 2) Дополнительная запись удаления указателей в деструкторах отпадает, так как будет error(я же чищу всё под конец мэйна), но если бы не очищал, то в каком деструкторе необходимо "проводить чистку" динам. памяти , в деструкторе абстрактного класса , которые является виртуальным , или же в деструкторах производных?

Добавлено через 12 минут
И через несколько минут меня осенило.... Зачем я удаляю указатели, если я их возможно буду использовать....Но проблема так же возникает с обнулением , в массиве указателей они обнуляются, а вот в сами указатели по прежнему имеют данные(пришёл вот к такому решению, но хотел бы увидеть аналог:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (first) //если в первом указателе уже находится объект то очистить всё необходимое
    {
        Symbol::GetCount() = 0;
        Zero::CountZ = 0;
        Cross::CountC = 0;
        for (int i = 0; i < 9; i++)
            mass[i] = 0;
        for (int i = 0; i < 9; i++)
        {
            masC[i] = 0;
            masZ[i] = 0;
        }
        first = 0, second = 0, third = 0, four = 0, five = 0, six = 0, seven = 0, eight = 0, nine = 0;
    }
Но всё же вопрос открыт по поводу очистки в деструкторах.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
27.03.2017, 09:49 7
Ты сначала изучи разницу между самим указателем и тем, на что он указывает.
В твоём случае они вообще не нужны - массивы маленькие. Можно обойтись без динамического выделения. Ну а если используешь объекты повторно, то предусмотри какие-то функции для очистки содержимого.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.03.2017, 13:16 8
Цитата Сообщение от Nubila Посмотреть сообщение
А вот если бы массива не было? Но есть 9 указателей, каждому писать delete?
Либо так, либо создать какую-нибудь обёртку, можно даже так:
C++
1
2
3
int *first, *second, ...;
for (auto p : {first, second, ...})
    delete p;
1
2 / 2 / 1
Регистрация: 24.03.2017
Сообщений: 59
28.03.2017, 11:18  [ТС] 9
Спасибо большое.
0
28.03.2017, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2017, 11:18
Помогаю со студенческими работами здесь

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты,...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...


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

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