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

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

05.06.2017, 22:39. Просмотров 322. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2017, 22:39
Ответы с готовыми решениями:

Как правильно использовать деструктор исключений в наследующих классах?
Ни разу не видел использования деструктора класса std::exception в наследующем классе. Будет ли...

Может кто подсказать, правильно ли так использовать деструктор?
#include &quot;stdafx.h&quot; #include&quot;iostream&quot; using namespace std; template &lt;class T&gt; class...

Событие Loaded срабатывает слишком рано до отрисовки окна
Работаю с UWP, но на десктопе wpf похоже таже проблема. Лоадед срабатывает слишком рано до...

Слишком рано закрывается файл
Есть такой класс (используется для ведения лога приложения): using System.IO; using...

Как правильно написать деструктор?
#ifndef MY_CLASS_H #define MY_CLASS_H class My_class: public QWidget { Q_OBJECT public: ...

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

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

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

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


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

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

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