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

Шаблон и выделение памяти - C++

Восстановить пароль Регистрация
 
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
01.04.2011, 17:13     Шаблон и выделение памяти #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template<class T> T CreateArray(T a, int n)
{
    a = new T [n]; // ошибка: double* = double**
    return a;
}
 
int main()
{
    double* a;
    int n = 5;
    a = CreateArray(a,n);
    return 0;
}
Могу ли я выделить таким образом память? И в чем ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2011, 17:13     Шаблон и выделение памяти
Посмотрите здесь:

C++ Не выделение памяти
C++ Распределение памяти. Динамическое выделение памяти
C++ Выделение памяти
Выделение памяти C++
C++ выделение памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.04.2011, 17:57     Шаблон и выделение памяти #2
При специализации шаблона функция развернётся в следующую:

C++
1
2
3
4
5
double *CreateArray(double *a, int n)
{
    a = new double *[n];
    return a;
}
Таким образом, вы пытаетесь в a, которая имеет тип double *, записать то, что вернёт new, а вернёт он тип double **.
VASSUV
MiThEoN
 Аватар для VASSUV
412 / 278 / 15
Регистрация: 31.10.2009
Сообщений: 403
Записей в блоге: 2
01.04.2011, 18:28     Шаблон и выделение памяти #3
можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template<class T> T* CreateArray(T a, int n)
{
    return new T[n];
}
 
int main()
{
    double*a;
    a = new double;
    int n = 5;
    a = CreateArray(*a,n);
    return 0;
}
или так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template<class T> T CreateArray(T a, int n)
{
    return (T) malloc(n*sizeof(T*));
}
 
int main()
{
    double*a;
    a = new double;
    int n = 5;
    a = CreateArray(a,n);
    return 0;
}
но почему без 11 строки не работает?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.04.2011, 18:39     Шаблон и выделение памяти #4
Лучше тогда вот так. Только не вижу смысла делать эту бесполезную обёртку.
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
#include <iostream>
 
template< typename T >
T *alloc(size_t size)
{
    return new T [size];
}
 
class Foo
{
};
 
int main()
{
    double *dptr;
    int *iptr;
    Foo *fooptr;
 
    dptr = alloc< double >(10);
    iptr = alloc< int >(10);
    fooptr = alloc< Foo >(10);
 
    delete dptr;
    delete iptr;
    delete fooptr;
 
    return 0;
}
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
02.04.2011, 12:29  [ТС]     Шаблон и выделение памяти #5
Собственно я остановился на варианте

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T> T* CreateArray(int n)
{
    T* a = new T [n];
    return a;
}
 
int main()
{
    double* a;
    int n = 5;
    a = CreateArray<double>(n);
    return 0;
}
P.S. Проверка на NULL и освобождение это само собой - не о том речь.
P.P.S. Параллельно задал вопрос на басурманском форуме, много интересного узнал =). Если интересно - http://stackoverflow.com/questions/5...ory-allocation
Yandex
Объявления
02.04.2011, 12:29     Шаблон и выделение памяти
Ответ Создать тему
Опции темы

Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru