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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Написать и протестировать рекурсивную функцию вычисления http://www.cyberforum.ru/cpp/thread262346.html
∫▒dx/〖(x-a)〗^n = - 1/((n+1) 〖(x-a)〗^(n-1) ) прикрепляю файл,если не понятно
C++ Написать и протестировать функцию конкатенции строки Написать и протестировать функцию конкатенции строки STRNCAT (str1, str2, n), склеивающую str1 с n количеством символов из str2. Функция должна возвращать TRUE в случае успеха и FALSE в случае неудачи. http://www.cyberforum.ru/cpp/thread262345.html
Функции C++
Убрать из первой строки все символы, входящие во вторую строку уже окончательно запутался помогите пожалуйста
C++ Скоро аттестация, а программы написать все не могу(((
Скоро будут ставить аттестацию, а программы написать не могу - плохо усвоил тему((. Помогите написать 3 программы на обработку строк на языке С++: 1)Дана строка символов. Выяснить имеется ли в строке следубщие два символа стоящие рядом. 2)Определить, сколько в тексте слов, в состав которых входит слог сок. 3)Дан текст. Напечатать те слова, которвые удовлетворяют следующему свойству: буквы...
C++ Генерация программного кода по xml файлу http://www.cyberforum.ru/cpp/thread261646.html
Всем добрый день. Пишу дипломный проект - программу, позволяющую из блоков, подобных UML блокам составлять простые алгоритмы (линейные, условные и циклические) и выполнять их. Одной из обязательных условий является генерация кода на языке C из готовой блок-схему. Вот с генерацией у меня проблемы. Линейные алгоритмы без проблем, а вот условные никак не могу сделать. Блок-схема представляет из...
C++ Создание структуры "префиксное дерево". Ошибка "Access violation writing location". Есть структура данных - бор или префиксное дерево. class trie { char value; // символ узла trie** pointers; // ссылки на следующие узлы public: trie(char value = '#'){ this->value = value; this->pointers = new trie*; // выделение памяти FOR(i,0,26) this->pointers = 0; // обнуление подробнее

Показать сообщение отдельно
SQReder
 Аватар для SQReder
6 / 6 / 1
Регистрация: 04.07.2009
Сообщений: 50

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

23.03.2011, 14:10. Просмотров 829. Ответов 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);
}
Есть ли возможность описать универсальный деаллокатор, или мне придется описывать две процедуры для случаев с классами и без?
По идее выходом будет перегрузка функций для матрицы обьектов и матрицы указателей, но хотелось-бы универсализации.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru