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

Если применять эту функцию к массиву, то он будет удаляться без всяких утечек памяти и т.п.?

08.05.2019, 22:39. Просмотров 303. Ответов 4
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
//Функция удаления двумерного массива
void delete_array(int** arr, int row)
{
    for (int i = 0; i < row; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2019, 22:39
Ответы с готовыми решениями:

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

Отправка POST данных и файлов более 24 Мб и без утечек памяти
Всем привет, есть класс который отправляет POST с полями и файлом, все бы хорошо, да вот есть 2...

Написать функцию Факториал и программу, которая будет использовать эту функцию
Суть программы: Нужно написать функцию Факториал и программу.ю которая будет использовать эту...

Написать bat-файл, который будет удалять определённую папку и сам будет удаляться
Подскажите как написать bat который будет при запуске его будет удалять одну конкретную папку и сам...

4
3 / 3 / 0
Регистрация: 26.11.2018
Сообщений: 28
08.05.2019, 22:56 2
Да. В данном случае у вас массив массивов, поэтому удалять надо именно так.
0
Миниатюры
Если применять эту функцию к массиву, то он будет удаляться без всяких утечек памяти и т.п.?  
бах-бах и в продакшен!
1816 / 1098 / 417
Регистрация: 23.09.2014
Сообщений: 3,510
Записей в блоге: 4
09.05.2019, 10:19 3
Цитата Сообщение от GreyBasil Посмотреть сообщение
и т.п.?
а что будет, если вы вызовите эту delete_array два раза?

или раньше, чем будет создан массив arr?
0
(80 / 20 || 50 / 50) = x
1648 / 1121 / 432
Регистрация: 16.08.2014
Сообщений: 4,688
Записей в блоге: 1
09.05.2019, 12:25 4
---
0
бах-бах и в продакшен!
1816 / 1098 / 417
Регистрация: 23.09.2014
Сообщений: 3,510
Записей в блоге: 4
09.05.2019, 13:32 5
GreyBasil,
если ближе к итогу, то для большей безопасности желательно(очень!) использовать что-то типа такого:
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
133
134
135
136
137
138
#include <iostream>
 
///----------------------------------------------------------------------------|
/// Макросы для удобства.
///----------------------------------------------------------------------------:
#define SHOWVAL(v) std::cout << #v << " = "<< v << "\n"
#define FORi(n) for(int i = 0; i < n; ++i)
#define FORj(n) for(int j = 0; j < n; ++j)
#define PAUSE std::cin.get()
 
///----------------------------------------------------------------------------|
/// Двумерный динамический массив инкапсулированный в структуре.
///----------------------------------------------------------------------------:
template<class T>
class carr
{
public:
    carr(int _r, int _c) : arr(NULL), row(_r), column(_c)
    {   create_arr();
    }
    
   ~carr()
    {   delete_arr();
    }
    
    //------------------------------------------------------resize(int r, int c)
    void resize(int _r, int _c)
    {   row    = _r;
        column = _c;
        create_arr();
    }
    
    //-----------------------------------------------------------init_one(T val)
    void init_one(T _val)
    {   FORi(row)
            FORj(column)
                arr[i][j] = _val;
    }
    
    //--------------------------------------------------set(int r, int c, T val)
    void set(int _r, int _c, T _val)
    {   arr[_r][_c] = _val;
    }
    
    //---------------------------------------------------------get(int r, int c)
    T get(int _r, int _c)
    {   return arr[_r][_c];
    }
    
    //--------------------------------------------------------------------show()
    void show()
    {   std::cout << "\n\n";
        SHOWVAL(row);
        SHOWVAL(column);
        FORi(row)
        {   FORj(column)
            {   std::cout << arr[i][j] << "\t";
            }
            std::cout << "\n";
        }
    }
    
    T* operator [](const int i)const {return arr[i];}
    
T** arr;        // Почему тут будет плохо?
private:
    //T** arr;  // А здесь будет хорошо!
    
    int row, column;
    
    //--------------------------------------------------------------create_arr()
    void create_arr()
    {   if(arr != NULL) delete_arr();
        arr = new T*[row];
        FORi(row)
        {   arr[i] = new T[column];
        }
    }
    
    //--------------------------------------------------------------delete_arr()
    void delete_arr()
    {   FORi(row)
        {   delete[] arr[i];
        }
        delete[] arr;
        arr = NULL;
    }
    
};
#undef FORi
#undef FORj
    
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   
    int** arr2;
    
    {
        carr<int> matrix(3,4);
        matrix.init_one(0);
        matrix.show();
        
        matrix.resize(5, 6);
        matrix.init_one(2019);
        matrix.show();
    
        matrix.set(0, 1, 1945);
        SHOWVAL(matrix.get(0,1));
        matrix.show();
        
        arr2 = matrix.arr;   // Передали внаружу.(публичный arr это позволит)
                             // Если бы arr был приватный, то ошибка была бы
                             // отловлена на этапе компиляции.
        
        SHOWVAL(arr2[0][1]); // Пока внутри все хорошо.
        
        ///-----------------------------|
        /// Тест перегруженных скобок:  |
        //------------------------------|
        matrix[3][3] = 0;
        matrix.show();
        matrix[0][0] = matrix[3][3];
        matrix.show();
      ++matrix[0][0] += 2;
        matrix.show(); // для элемента(0,0) результат = 3
    }
    
    // Здесь объект matrix будет уничтожен и вся память выделенная в нем будет
    // освобождена!
    
    //arr2 - висячий указатель!!!
    SHOWVAL(arr2[0][1]);     // Тут фейл!
                             // Поэтому arr надо сделать приватным!
    PAUSE;
    return 0;
}
тут я заодно обозначил одну из многочисленных возможных проблем.(см. код)

После того как вы осознаете этот код, вы можете задать вопрос:
А если мне все же хотца использовать указатели снаружи?
то это будет означать, что вы все еще СИШНИК! (т.е. человек с сишным мышелнием)
Конечно же вы можете использовать указатели на динмассивы и снаружи, но рискуя(сильно) остаться без ног.
Но вопрос тут в другом, а зачем это надо?
Крестовик сможет обойтись без этого, а вот сишник, наверняка нет...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2019, 13:32

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

Применять к одному, а применяется ко всему массиву
Привет всем, не знаю есть ли такое, но все же спрошу, к примеру есть класс MyClass в котором очень...

Правила оформления запроса лечения. Если не будет логов, мы отправим вас в эту тему
FAQ Как оформить запрос о помощи в разделе лечения? Внимание! Инструкции, подготовленные...

Как создать файл без расширений? Без всяких .txt и т п
Procfile надо создать без всяких расширений Добавлено через 30 минут Уже создал с помощью python

Использование команды system(); Без всяких окон (без dos и т.д)
Вообще реально сделать чтобы обратиться к системе в фоновом режиме. Без отрытия dos. Без всякой...

Устал от утечек памяти
С этими утечками памяти в C++ просто беда. Посоветуйте, что можно сделать? Может быть есть какие-то...

Обнаружение утечек памяти
Существуют ли какие-нибудь средства позволяющие отлаживать ошибки, вызванные утечками памяти? ...


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

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

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