Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
SQReder
6 / 6 / 1
Регистрация: 04.07.2009
Сообщений: 50
#1

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

23.03.2011, 14:10. Просмотров 856. Ответов 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
/* -----------------------------------------
 Шаблон для выделения памяти под матрицу
 ----------------------------------------- */
template<typename T>
T** allocate_matrix(unsigned int h, unsigned int w, T default_value = NULL) {
    T** matrix = new T*[h];
    for (unsigned int y = 0; y < h; y++) {
        matrix[y] = new T[w];
        for (unsigned int x = 0; x < w; x++)
            matrix[y][x] = default_value;
    }
 
    return matrix;
}
 
/* -----------------------------------------
 Шаблон освобождения памяти
 усли destroy == true то для каждого
 значения сначала вызывается деструктор
 ----------------------------------------- */
template<typename T>
void delete_matrix(T** matrix, unsigned int h, unsigned int w, bool destroy =
    false) {
    // если нулевой указатель - то выходим из функции - освобождать нечего
    if (matrix == NULL)
        return;
 
    // проходим по строкам матрицы
    for (unsigned int y = 0; y < h; y++) {
        // если указано вызвать деструкторы - вызывем
        // для каждого значения в строке
        if (destroy)
            for (unsigned int x = 0; x < w; x++)
                delete matrix[y][x];
        // освобождаем память от строки
        delete[]matrix[y];
    }
 
    // освобождаем указатель на строки
    delete[]matrix;
}
в этом примере все прекрасно работает, деструкторы вызываются
C++
1
2
3
4
5
void foo() {
  SomeClass *** matrix;
  matrix = allocate_matrix<SomeClass>(10, 10);
  delete_matrix(matrix, 10, 10, true);
}
а здесь мы работаем с простыми типами, не имеющими деструкторов, поэтому этот код даже не компилируется
C++
1
2
3
4
5
void bar() {
  int ** matrix;
  matrix = allocate_matrix<int>(10, 10);
  delete_matrix(matrix, 10, 10);
}
Есть ли возможность описать универсальный деаллокатор, или мне придется описывать две процедуры для случаев с классами и без?
По идее выходом будет перегрузка функций для матрицы обьектов и матрицы указателей, но хотелось-бы универсализации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2011, 14:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Опциональный вызов деструктора в шаблоне (C++):

Ошибка в шаблоне функции - C++
Доброго времени суток. У меня проблема с функцией для чтения таблицы из файла, которая спокойно работает с типами int и float, но не хочет...

Вызов деструктора и возникающие при этом чудеса - C++ Builder
Здравствуйте все! Начал разработку своего класса и после непродолжительного времени разработки столкнулся с неведомым. Приведу пример...

Наследование деструктора класса. - C++ Builder
Всем доброе время суток. Допустим есть 2 класса: class TParentClass { // ... public: __fastcall ~TParentClass(void); ...

Использование конструктора и деструктора - C++ Builder
Добрый вечер подскажите пожалуйста как эту прогу сделать с использованием конструктора и деструктора class Paint : public TForm1 //Создаем...

Реализация класса (конструктора и деструктора) - Visual C++
Нужна помощь в исправлении программы (в Dev c++ компилируется и работает, а в Visual Studio - нет) #include &lt;iostream.h&gt; #include...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.03.2011, 18:44 #2
Цитата Сообщение от SQReder Посмотреть сообщение
if (destroy) for (unsigned int x = 0; x < w; x++) delete matrix[y][x];
Это удаляет объект, на который хранится указатель в матрице. Т.е. когда Т - указатель. Если использовать интеллектуальные указатели или хранить в матрице значения, то в этом цикле необходимость отпадает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2011, 18:44
Привет! Вот еще темы с ответами:

Использование конструкторов и деструктора при проектировании пользовательского класса - Visual C++
1. Создать класс с именем PRICE, содержащий следующие поля: ■ название товара; ■ название магазина, в котором продается товар; ...

Вызов деструктора - C++
При ручном вызове деструктора, освобождается ли память*

Вызов деструктора - C++
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...


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

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

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