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

Нужен совет по выделению памяти - C++

Восстановить пароль Регистрация
 
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
13.08.2012, 22:31     Нужен совет по выделению памяти #1
Здравствуйте. В проекте частенько нужно выделять память только желательно проверять на bad_alloc.

Написал функцию алокатор с проверкой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void* SafeMemoryAlloc(void ** ptr, size_t bytes, size_t size)
{
    try
    {
        if ( ptr == NULL )
        {
            throw "Ptr to memory alloc is NULL or bad argument";
        }
        *ptr = malloc(size * bytes);
    }
    catch(const char* exc)
    {
        cout << exc << endl;
    }
    catch(std::bad_alloc)
    {
        cout << "Bad memory allocation in SafeMemoryAlloc";
    }
    return *ptr;
    
}
Какие у Вас будут замечания и не дико ли смотрится вызов функции:

C++
1
this->wndName = (char*)SafeMemoryAlloc( (void**)&this->wndName, sizeof(char) , FNAME_MAX_LEN );
Спасибо за внимание!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 22:31     Нужен совет по выделению памяти
Посмотрите здесь:

C++ нужен совет!!!
Нужен совет! C++
C++ Нужен совет
Нужен совет! C++
C++ Нужен совет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vampir64
13.08.2012, 23:05
  #2

Не по теме:

А я хотел бы спросить у знатоков, чем может быть оправдан malloc вместо new?

DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 23:13     Нужен совет по выделению памяти #3
malloc не кидает исключений.
сама конструкция дикая, черт ногу сломит. потом нужно будет не забыть правильно отчистить память,
стандартный delete в этом случае не будет корректно работать.
вообще затея с самодельным выделением памяти не совсем понятна.
если исключения при выделении памяти нужно подавить и не хочется везде в коде расставлять блоки отлова исключений, то для этого есть специальный некидающий исключения оператор new
http://www.cplusplus.com/reference/std/new/nothrow/
этим оператором пытаетесь создать объект. проверяете полученный указатель на равенство нулю.
если ноль - делаете печатаете всякую хрень или еще что-то делаете, если же все хорошо - код выполняется дальше. Если же не хочется везде в коде вставлять печать диагностики, то можно написать пачку шаблонных функций что-то типа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename T>
T* New()
{
   return new T();
}
 
template <typename T, typename Arg1>
T* New(const Arg1& arg1)
{
   return new T(arg1);
}
 
template <typename T, typename Arg1, typename Arg2>
T* New(const Arg1& arg1, const Arg2& arg2)
{
   return new T(arg1, arg2);
}
 
...
Ну и такие функции можно дополнить всякой диагностикой. В общем много чего можно сделать и более кошерно чем то, что у вас сейчас. А чтобы сделать кошерно - нужно сперва понять с чем вы боритесь.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.08.2012, 23:57     Нужен совет по выделению памяти #4
Цитата Сообщение от Dr.Urban Посмотреть сообщение
catch(std::bad_alloc)
{
cout << "Bad memory allocation in SafeMemoryAlloc";
}
этот код никогда не будет выполнен
кроме того правильней catch(std::bad_alloc&)
rangerx
14.08.2012, 01:16
  #5

Не по теме:

Цитата Сообщение от vampir64 Посмотреть сообщение
чем может быть оправдан malloc вместо new?
Перегрузкой new )) В остальном, единственное что приходит в голову, это захват некоторого объёма "сырой" памяти, скажем, под объекты какого-нибудь класса
C++
1
2
3
4
some_class* p = static_cast<some_class*>( std::malloc(10 * sizeof(some_class)) );
// ... конструируем объекты ...
// ...
free(p);
но даже в этом случае логичнее было бы воспользоваться функцией operator new
C++
1
2
3
4
some_class* p = static_cast<some_class*>( operator new(10 * sizeof(some_class)) );
// ... конструируем объекты ...
// ...
operator delete(p);

alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
14.08.2012, 01:27     Нужен совет по выделению памяти #6
Цитата Сообщение от vampir64 Посмотреть сообщение
А я хотел бы спросить у знатоков, чем может быть оправдан malloc вместо new?
единственное применение (которое мне видитится) - выделение памяти, которая будет передана и освобождена внутри сишной библиотеки
всякое взаимодействие с backend-си кодом так и живет
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
14.08.2012, 02:16  [ТС]     Нужен совет по выделению памяти #7
DU, Спасибо за потраченое время и на мой взгляд хорошый пост.

Всем остальным спасибо также!
returnless
25 / 25 / 3
Регистрация: 05.08.2012
Сообщений: 83
14.08.2012, 06:46     Нужен совет по выделению памяти #8
глянь на менеджер памяти от Id Software
Doom3_SDK качнуть бесплатно можно из сети, а в папке Doom3_SDK\src\idlib есть
Heap.h
Heap.сpp

This is a replacement for the compiler heap code (i.e. "C" malloc() and
free() calls). On average 2.5-3.0 times faster than MSVC malloc()/free().
Worst case performance is 1.65 times faster and best case > 70 times.

Не по теме:

знаю у дельфей в частности у d2010 еще быстрый менеджер памяти. по идее можно поковыряться и слизать его на сцы.



еще выравнивание нужно обязательно прикрутить к твоей ф-ии. проц быстрее работать будет с такой памятью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 11:14     Нужен совет по выделению памяти
Еще ссылки по теме:

Нужен совет C++
Нужен совет! C++
C++ Нужен совет

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
14.08.2012, 11:14     Нужен совет по выделению памяти #9
имеет смысл тогда статический пул писать
Yandex
Объявления
14.08.2012, 11:14     Нужен совет по выделению памяти
Ответ Создать тему
Опции темы

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