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

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

Войти
Регистрация
Восстановить пароль
 
CyberGudvin
1 / 1 / 0
Регистрация: 27.09.2013
Сообщений: 88
#1

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

05.06.2017, 22:39. Просмотров 162. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как правильно использовать деструктор? Он слишком рано срабатывает (C++):

Подскажите как правильно добавить виртуальный деструктор - C++
Доброго времени суток Подскажите пожалуйста, как правильно добавить виртуальный деструктор в класс Int, Double, String и что он должен...

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

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

Не срабатывает деструктор и дочернего класса - C++
Собственно, такие дела. Использую наследование, несколько цепочек одного от другого 1-&gt;2-&gt;3-&gt;.... И сегодня неожиданно обнаружил, что у...

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

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

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

Почему деструктор срабатывает больше раз, чем количество созданных объектов? - C++
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды. Вот пример #include &lt;iostream&gt; #include...

Правильно ли написан деструктор? - C++
Вопрос, правильно ли я написал деструктор. Должно удалить переменную из памяти CAR И ссылку НА CDR, но сам по себе обьект CDR не трогать. ...

Как правильно использовать thread? - C++
Не могу понять как удалить поток thread во время его выполнения. То есть у меня есть поток в которым зацикливание (ниже в коду увидите) и в...

Как правильно использовать потоки? - C++
Тему про потоки прочёл. Так же ознакомился с классом mutex. И вот есть некий вопрос: как правильно использовать синхронизацию потоков в...


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

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

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