4 / 4 / 0
Регистрация: 21.12.2015
Сообщений: 195
1

Как правильно освободить память деструктором?

05.12.2016, 23:03. Показов 1180. Ответов 5
Метки нет (Все метки)

Не могу понять, как освободить память деструктором... В общем, я объявляю в private динамический массив на 3 элемента, после чего память от массива нужно освободить, а вот как это сделать я не знаю... (на этот код ошибок не выдает, но приложение не закрывается (опытным путем понял, что виноват деструктор))
Для краткости:
C++
1
int *arr = new int[3];
C++
1
2
3
4
~Fractions() {
        delete [] arr;
        cout << "Деструктор сработал!" << endl;
    }
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstring>
#include <cctype>
#include <windows.h>
 
using namespace std;
 
class Fractions {
private:
    int *arr = new int[3];
    char tmp[500];
public:
    Fractions() {
        arr[1] = 0;
        arr[2] = 1;
        arr[0] = 0;
        cout << "Конструктор без параметров сработал!" << endl;
    }
    Fractions(char str[]) {
        char *pch = strtok(str," +/");
        for (int i = 0; i <= 3; i++){
            arr[i] = atoi(pch);
            pch = strtok(NULL," +/");
        }
        cout << "Конструктор с параметром - строка, сработал!" << endl;
    }
    Fractions(int arr[]) {
        arr[0] = 0;
        arr[1] = 0;
        arr[2] = 1;
        cout << "Конструктор с параметром - массив, сработал!" << endl;
    }
    Fractions(const Fractions &obj) {
        cout << "Конструктор копирования сработал!" << endl;
    }
    ~Fractions() {
        delete [] arr;
        cout << "Деструктор сработал!" << endl;
    }
 
    void getData(){
        cout << "Целое = " << arr[0] << endl;
        cout << "Делимое = "<< arr[1] << endl;
        cout << "Делитель = "<< arr[2] << endl;
    }
 
    void setData(){
        cout << "Введите выражение!" << endl;
        cin >> tmp;
        char *pch = strtok(tmp," +/");
        for (int i = 0; i <= 3; i++){
            arr[i] = atoi(pch);
            pch = strtok(NULL," +/");
        }
    }
};
 
int main() {
    int a[3] = {21, 1, 2};
    char b[] = "24+1/ 2";
    setlocale(LC_ALL,"rus");
    Fractions obj1;
    obj1.setData();
    obj1.getData();
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2016, 23:03
Ответы с готовыми решениями:

Как правильно освободить память
Написал вот такой костыль: wchar_t* getDate() { time_t seconds = time(NULL); tm timeinfo =...

Как правильно освободить память
Здрасте! (Тема: Шаблоны функций.) Не могу правильно написать метод для освобождения памяти. В...

Как правильно освободить память
Здравствуйте все! Подскажите, как правильно освобождать память, выделенную под массив оператором...

Как правильно освободить память
Есть функция char* md5(const char*). Как освободить память выделенную ею? #include &lt;openssl\md5.h&gt;...

5
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
05.12.2016, 23:31 2
Лучший ответ Сообщение было отмечено Blekzet как решение

Решение

Вот кусок, который надо поменять:
C++
1
2
3
4
5
6
7
8
9
10
11
class Fractions {
private:
    int *arr ;
    char tmp[500];
public:
    Fractions(): arr(new int[3]) {
        arr[1] = 0;
        arr[2] = 1;
        arr[0] = 0;
        cout << "Конструктор без параметров сработал!" << endl;
    }
переменные-члены нельзя инициализировать при объявлении, но можно в конструкторе, или как у меня при инициализации конструктора
1
4 / 4 / 0
Регистрация: 21.12.2015
Сообщений: 195
05.12.2016, 23:55  [ТС] 3
Можно более простым языком (трудности в семантическом понимании текста)
P.S Каждый раз, когда я буду использовать этот массив, нужно выделять память в самом конструкторе?

Добавлено через 10 минут
VAN0, все так же виснет...
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
05.12.2016, 23:58 4
Цитата Сообщение от Blekzet Посмотреть сообщение
C++
1
2
for (int i = 0; i <= 3; i++)
{ arr[i] = atoi(pch);
Выходишь за границу выделенной памяти (в конструкторе и в setData()): нужно просто: i < 3.
0
4 / 4 / 0
Регистрация: 21.12.2015
Сообщений: 195
06.12.2016, 00:01  [ТС] 5
Проблема решена, спасибо VAN0 и nd2 (да сглупил чет)
0
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
06.12.2016, 00:09 6
Цитата Сообщение от VAN0 Посмотреть сообщение
переменные-члены нельзя инициализировать при объявлении
Всё правильно с этим, C++11 позволяет.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2016, 00:09
Помогаю со студенческими работами здесь

Подскажите пожалуйста, как правильно освободить память
Всем ку! Подскажите пожалуйста, как правильно удалить(освободить память) массива array2D. ...

Динамическая матрица. Как правильно освободить память?
int ROWS = NULL; // Объявление переменных для строк и столбцов. int COLS = NULL; cin &gt;&gt; ROWS...

Как правильно освободить память после работы с динамическим массивом
Здравствуйте! Помогите понять в чём проблема при освобождении памяти. Простой пример: #define...

Как освободить память?
подскажите как правильно освободить память,спасибо заранее))) #include &quot;stdafx.h&quot; #include...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru