Создать и инициализировать переменную внутри template
От: zombiee Россия http://artcoding.ru/
Дата: 02.05.12 15:45
Оценка:
Здравствуйте!
Подскажите, пожалуйста, возможно ли сделать что-то вроде этого:
template<class Pointer, typename TYPE>
inline void NEW(Pointer *&p, TYPE type, size_t mem_size){
  size_t size=(mem_size*sizeof(type));
  p=(type *)malloc(size);
  ZeroMemory(p, size);
}


Пример использования (как бы хотелось ):
template<class Pointer>
inline void DEL(Pointer *&p){
  free(p);
  p=NULL;
}

void test(void){
  NEW(CurDir, TCHAR, MAX_PATH);
  GetCurrentDirectory(MAX_PATH*sizeof(TCHAR), CurDir);
//  ...
  DEL(CurDir);
}


Заранее спасибо за ответ!
Re: Создать и инициализировать переменную внутри template
От: Vamp Россия  
Дата: 02.05.12 15:55
Оценка:
Z>Подскажите, пожалуйста, возможно ли сделать что-то вроде этого:
Z> NEW(CurDir, TCHAR, MAX_PATH);
Вот это что такое? TCHAR — это же тип, если мне не изменяет склероз. В чем задача-то? Выделить память с одновременным ее занулением? В C для этого есть calloc. В С++ можно использовать vector<char>.
Что до твоего DEL — то это вообще плохая идея, забудь.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Создать и инициализировать переменную внутри template
От: zombiee Россия http://artcoding.ru/
Дата: 02.05.12 16:09
Оценка:
Здравствуйте, Vamp, Вы писали:

V>TCHAR — это же тип, если мне не изменяет склероз. В чем задача-то?

Хочется контролировать выделение памяти + уменьшить код для создания переменных.

Что-то вроде:
NEW(String1, TCHAR, 12); // TCHAR *String1=(TCHAR *)malloc(12*sizeof(TCHAR));
NEW(String2, char, 12); // char *String2=(char *)malloc(12*sizeof(char));
// ...
_tprintf(_T("String1: '%s'\n"), String1);
printf("String2: '%s'\n", String2);

Бредовая идея?

V>Что до твоего DEL — то это вообще плохая идея, забудь.

Почему? Ведь можно контролировать/отлаживать высвобождение занятой памяти.
Re[3]: Создать и инициализировать переменную внутри template
От: Vamp Россия  
Дата: 02.05.12 16:29
Оценка:
V>>TCHAR — это же тип, если мне не изменяет склероз. В чем задача-то?
Z>Хочется контролировать выделение памяти + уменьшить код для создания переменных.
Все равно не понимаю. Не хочется писать каждый раз cast и sizeof? Используй инструменты C++ — new, vector, string.
То есть, сделать-то это просто:

template<class T>
T* my_new(T*& obj, size_t size) {
        obj = static_cast<T*>(malloc(size));
        return obj;
}

Но зачем?
String1 = new TCHAR(12) — гораздо нагляднее.

Z>Почему? Ведь можно контролировать/отлаживать высвобождение занятой памяти.

Таким образом — нельзя. Что ты будешь делать, если у тебя этот указатель существует более чем в одном экземпляре?
Вообще непонятно, зачем ты пытаешься писать на уродливой смеси C и C++.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Создать и инициализировать переменную внутри template
От: Vamp Россия  
Дата: 02.05.12 16:30
Оценка:
V>То есть, сделать-то это просто:
Сорри, чуть забыл кое-что:
template<class T>
T* my_new(T*& obj, size_t size) {
        obj = static_cast<T*>(malloc(size * sizeof(T)));
        return obj;
}
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Создать и инициализировать переменную внутри template
От: Stanislav V. Zudin Россия  
Дата: 02.05.12 16:33
Оценка:
Здравствуйте, zombiee, Вы писали:

Z>Здравствуйте, Vamp, Вы писали:


V>>TCHAR — это же тип, если мне не изменяет склероз. В чем задача-то?

Z>Хочется контролировать выделение памяти + уменьшить код для создания переменных.

Z>Что-то вроде:

Z>
Z>NEW(String1, TCHAR, 12); // TCHAR *String1=(TCHAR *)malloc(12*sizeof(TCHAR));
Z>NEW(String2, char, 12); // char *String2=(char *)malloc(12*sizeof(char));
Z>// ...
Z>_tprintf(_T("String1: '%s'\n"), String1);
Z>printf("String2: '%s'\n", String2);
Z>

Z>Бредовая идея?

V>>Что до твоего DEL — то это вообще плохая идея, забудь.

Z>Почему? Ведь можно контролировать/отлаживать высвобождение занятой памяти.

А лучше всего вообще не выделять/освобождать память. Тогда и контролировать не придется.
Vamp уже подсказал решение — std::vector.


void test(void)
{
   std::vector<TCHAR> CurDir(MAX_PATH, _T('\0'));
   GetCurrentDirectory(MAX_PATH*sizeof(TCHAR), &CurDir[0]);
//  ...
}
_____________________
С уважением,
Stanislav V. Zudin
Re[4]: Создать и инициализировать переменную внутри template
От: zombiee Россия http://artcoding.ru/
Дата: 02.05.12 16:48
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Но зачем?

V>String1 = new TCHAR(12) — гораздо нагляднее.
У всех свои тараканы в голове
Почему-то вбил себе в голову, что хочу запись вида NEW(var, type, size), где


V>Таким образом — нельзя. Что ты будешь делать, если у тебя этот указатель существует более чем в одном экземпляре?

Действительно, тут я не подумал. Спасибо

V>Вообще непонятно, зачем ты пытаешься писать на уродливой смеси C и C++.

До этого пытался переопределить new и delete, ничего хорошего не вышло По этому для теста использовал вызовы malloc, free, и т. д.

В общем,Vamp, большое спасибо за разъяснения
Понял, что несу бред
Re[4]: Создать и инициализировать переменную внутри template
От: _NN_  
Дата: 02.05.12 16:50
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>
SVZ>void test(void)
SVZ>{
SVZ>   std::vector<TCHAR> CurDir(MAX_PATH, _T('\0'));
SVZ>   GetCurrentDirectory(MAX_PATH*sizeof(TCHAR), &CurDir[0]);
SVZ>//  ...
SVZ>}
SVZ>


Конструктор вектора обнулит память и так.
vector<TCHAR> CurDir(MAX_PATH);


P.S.
Если нужен MAX_PATH, я бы просто взял обычный массив или std(boost)::array.
TCHAR CurDir[MAX_PATH] = {}; // Обнуляем
// Или
std(boost)::array<TCHAR, MAX_PATH> CurDir = {}; // Обнуляем
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Создать и инициализировать переменную внутри template
От: Vamp Россия  
Дата: 02.05.12 17:11
Оценка:
Z>До этого пытался переопределить new и delete, ничего хорошего не вышло По этому для теста использовал вызовы malloc, free, и т. д.
А зачем ты их переопределял и как?
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.