Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
CyberGudvin
1 / 1 / 1
Регистрация: 27.09.2013
Сообщений: 88
#1

Как правильно использовать деструктор? Он слишком рано срабатывает

05.06.2017, 22:39. Просмотров 189. Ответов 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
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class MyArray
{
    int *ptrarray;                  //массив
    int count;                      //количество элементов
    bool check_index(int index);    //Проверка на выход за пределы массива
 
    public:
    MyArray(int n) {
        cout<< "Тут сработал конструктор!\n";
 
        count = n;
        ptrarray = new int [count];
    } 
 
    MyArray() {
        cout<< "Тут сработал конструктор!\n";
 
        count =0;
        ptrarray = NULL;
    } 
 
    ~MyArray() {
        delete [] ptrarray;
        cout<< "Тут сработал деструктор "<<"\n";
    }
 
    int get_num(int index);                         //Получение элемента массива 
    void set_num(int index, int num);               //Внесение элемента в массив 
    void create_array(int n);                       //Инициализация массива через метод
    int get_count();                                //Получить значение количества элементов
    void fill_array();                              //Заполнить масив 
    void print_array();                             //Вывести масив
    void print_num();                               //Вывести определенный элемент 
    void arr_addition(MyArray obj1, MyArray obj2);  //Поэлементное сложение массивов
};
 
void MyArray::create_array(int n)
{
    count = n;
    ptrarray = new int [count];
}
 
int MyArray::get_count()
{
    return count;
}
 
void MyArray::fill_array()
{
    for (int i = 0; i < count; i++) 
        cin>>ptrarray[i];
}
 
void MyArray::print_array()
{
    for (int i = 0; i < count; i++) 
        cout<<ptrarray[i]<<endl;
    cout<<endl;
}
 
void MyArray::print_num()
{
    int index;
    cout<<"Введите индекс нужного вам элемента, index= ";
    cin>>index;
    if(check_index(index))
        cout<<"Значение выбранного вами элемента = "<<get_num(index)<<endl;
    else cout<<"ОШИБКА! Выбранный индекс выходит за пределы массива!"<<endl;
}
 
bool MyArray::check_index(int index)
{
    --index;
    if((index<count)&&(index>=0))
        return true;
    else return false;
}
 
int MyArray::get_num(int index)
{   
    --index;
    return(ptrarray[index]);
}
 
void MyArray::set_num(int index, int num)
{
    if(check_index(index))
        ptrarray[index] = num;
}
 
void MyArray::arr_addition(MyArray obj1, MyArray obj2)
{
    if(obj1.get_count() != obj2.get_count())
        cout<<"ОШИБКА! Границы индексов у массивов неодинаковые!"<<endl;
    else 
    {
        create_array(obj1.get_count());
        for (int i = 0; i < count; i++)
        {
            ptrarray[i] = obj1.get_num(i+1) + obj2.get_num(i+1);
        }
    }
}
 
int _tmain()
{
    setlocale(LC_ALL, "Russian");
    int n;
 
    cout<<"Введите размер массива, n= ";
    cin>>n;
 
    MyArray arr1(n);        //Создаем массив 1
    MyArray arr2(n);        //Создаем массив 2
    arr1.fill_array();      //Заполняем массив 1
    arr1.print_array();     //Выводим массив 1
    arr2.fill_array();      //Заполняем массив 2
    arr2.print_array();     //Выводим массив 2
 
    MyArray arr3;                   //Создаем массив 3
    arr3.arr_addition(arr1, arr2);  //Заполняем массив 3 поэлементным сложением массива 1 и 2
    arr3.print_array();             //Выводим массив 3
    arr1.print_array();             //Выводим массив 1
    arr2.print_array();             //Выводим массив 2
 
    system("PAUSE");
    return 0;
}
Насколько я знаю именно в деструкторе обычно освобождается занятая память. Что я и делаю. Но делаю что-то не так. Мне надо еще продолжать работать с массивами 1 и 2, а деструктор их уже почистил. И естественно когда я их вывожу в конце - выводится всякая ерунда. Как быть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2017, 22:39
Ответы с готовыми решениями:

Подскажите как правильно добавить виртуальный деструктор
Доброго времени суток Подскажите пожалуйста, как правильно добавить...

Деструктор класса. Как правильно очистить память?
Добрый день! Написал прогу бинарного дерева поиска, все работает, но нужен...

Преждевременно срабатывает деструктор
Здравствуйте! Не могли бы вы помочь со следующей проблемой: реализую класс...

Не срабатывает деструктор и дочернего класса
Собственно, такие дела. Использую наследование, несколько цепочек одного от...

Как правильно сохранить структуру, унаследованную от структуры, содержащую виртуальный деструктор?
Здравствуйте! Имеется структура: struct Product { int mId; double...

1
MrGluck
Модератор
Эксперт CЭксперт С++
8075 / 4927 / 1431
Регистрация: 29.11.2010
Сообщений: 13,352
05.06.2017, 23:05 #2
CyberGudvin, для локальных переменных деструктор вызывается при выходе из области видимости. В данному случае, при выходе из main.
А вот правила трёх вы не соблюдаете. Опишите конструктор копий и оператор копирующего присваивания.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2017, 23:05

Не срабатывает деструктор, и звук издает винда по окончанию отработки программы
Добрый вечер ребят подскажите пожалуйста , нужно чтобы имя пароль и дата...

Почему деструктор срабатывает больше раз, чем количество созданных объектов?
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор...

Правильно ли написан деструктор?
Вопрос, правильно ли я написал деструктор. Должно удалить переменную из памяти...


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

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

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