Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
#1

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

13.08.2012, 22:31. Просмотров 463. Ответов 8
Метки нет (Все метки)

Здравствуйте. В проекте частенько нужно выделять память только желательно проверять на 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 );
Спасибо за внимание!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 22:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нужен совет по выделению памяти (C++):

Нужен совет! - C++
Доброго времени суток! Возможно таких тем как эта было уже миллион.. но всё же, хотелось бы услышать ваше мнение. Поставил перед...

Нужен совет! - C++
Народ вот у меня вопрос если я прочитаю книгу &quot;Программирование. Принцыпы и практика использования C++&quot; и кое что не пойму то стоит ли...

Нужен совет - C++
Хочу начать изучать С++. Посоветуйте какие-нибудь книги или самоучители. Учить буду с нуля. До этого немного учил Паскаль, но понял, что...

Нужен совет: - C++
я учусь в 2-ом курсе на программиста у меня есть базовые знание c++,STL до сих пор работал только с консолью,опыта нету что дальше...

Нужен совет! - C++
Здравствуйте уважаемые! Подскажите пожалуйста книгу по С++ , чтобы в ней толком обьяснялось про такие детали, как к примеру _WIN32_WINDOWS...

Нужен совет - C++
Вообщем написал программу, вкратце : сущ-ет класс человек, а классы менеджер, рабочий и ученый наследуют его св-ва. Нужно обратиться к...

8
vampir64
13.08.2012, 23:05
  #2

Не по теме:

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

0
DU
1485 / 1131 / 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);
}
 
...
Ну и такие функции можно дополнить всякой диагностикой. В общем много чего можно сделать и более кошерно чем то, что у вас сейчас. А чтобы сделать кошерно - нужно сперва понять с чем вы боритесь.
2
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.08.2012, 23:57 #4
Цитата Сообщение от Dr.Urban Посмотреть сообщение
catch(std::bad_alloc)
{
cout << "Bad memory allocation in SafeMemoryAlloc";
}
этот код никогда не будет выполнен
кроме того правильней catch(std::bad_alloc&)
1
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);

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

Всем остальным спасибо также!
1
returnless
26 / 26 / 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 еще быстрый менеджер памяти. по идее можно поковыряться и слизать его на сцы.



еще выравнивание нужно обязательно прикрутить к твоей ф-ии. проц быстрее работать будет с такой памятью.
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
14.08.2012, 11:14 #9
имеет смысл тогда статический пул писать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 11:14
Привет! Вот еще темы с ответами:

Нужен совет - C++
Всем добрый день. Кто нибудь может поделиться компилятором Турбо Си++ или каким нибудь другим ...? Или подсказать где можно...

Нужен совет! - C++
Как можно сделать что бы переменную произвольного типа объявленную в одной функции, можно было использовать во всех остальных(все остальные...

Нужен совет - C++
Последний раз прогал очень давно, уже подзабыл, нужен совет. Дан текстовый файл, в котором имеется последовательность чисел (например 2 2...

нужен совет!!! - C++
блин скачала еле как этот си...dev c++....ввожу программу и нажимаю компелировать...он компелирует видимо и ничего не выдает...кроме того...


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

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

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