![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
rudvil |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Нужно как-то ограничить используемую программой память, например как в php.
Выставил в настройках скажем "20 мб" и выше этой планки программа потреблять памяти не будет. Насколько я понимаю, мне нужно перегрузить используемый мною оператор "new" / "delete", и при каждой попытке выделении памяти, увеличивать счетчик, ну и при удалении уменьшать счетчик соотвественно... С "new" проблем не возникло...
не могу нигде найти информацию по этому...
т.е. как в этих случаях можно узнать размер удаляемого блока("mem")? Чтобы можно было уменьшить счетчик используемой памяти... з.ы. операторы перегружаю глобально --------------------
xor |
||||
|
|||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 8 Всего: 146 |
||||
|
||||
rudvil |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Спасибо, то что нужно ![]() Но это как я понял только под винду =/ есть ли кроссплатформенные аналоги этой структуры? --------------------
xor |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
А я бы не писал перегрузку new/delete - это слишком тонкая штука, с которой легко ошибиться.
Вместо этого я бы создал свои классы, которые бы сами выделяли память и чистили её, под определённые типы данных (массивы, списки т.п.)? при этом держали бы объём в постоянном сравнении с максимальной величиной. Кроссплатформенно и безопасно ![]() -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
rudvil |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Возможно я так и поступлю, спасибо. Хотелось бы узнать как можно ошибиться если я использую всеголишь malloc и free...? --------------------
xor |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
можно еще глянуть на альтернативные менеджеры памяти: http://stackoverflow.com/questions/858592/...mic-crt-linking
возможно, в них уже есть встроенные фичи, которые вам нужны... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Можно поступить так: оператор new выделяет на 4 + sizeof(size_t) памяти больше, чем от него требуется. В первые четыре байта записывается некоторая сигнатура, затем записывается размер полезного блока памяти. Вызывающей функции возвращается указатель со смещением на 4 + sizeof(size_t) байт. оператор delete проверяет сигнатуру удаляемого блока памяти, вычитает размер из счетчика, вызывает free. Как вариант, можно сделать два вида сигнатур для new/delete и new[]/delete[] соответственно. Таким образом, будет дополнительная проверка правильности использования данных операторов. Хотя, правильнее всего использовать "менеджеры" памяти, о которых говорил Rickert, тем более, что даже контейнеры STL их поддерживают. |
|||
|
||||
rudvil |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
А вот это уже интересно... 2bsa, ваш вариант понравился больше всего, начну его использовать. Всем большое спасибо за помощь, решение найдено. ![]() --------------------
xor |
|||
|
||||
rudvil |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Возник ещё 1 вопрос
![]()
Взято отсюда. Код рабочий, всё ок. Я только не пойму одного, зачем добавлять + 1 если мы и так уже сместили указатель выделяемого блока на (size_t*) ? Это сообщение отредактировал(а) rudvil - 7.4.2010, 17:15 --------------------
xor |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Кстати, я бы не изменял size на размер size_t, так как в последующих вычислениях придется постоянно вычитать. |
|||
|
||||
rudvil |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Извиняюсь, ступил... все верно. А насчет вычислений, я не имею ничего против вычитаний. =] Это сообщение отредактировал(а) rudvil - 7.4.2010, 15:46 --------------------
xor |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это называется пессимизация - т.е. выполнение лишних операций.
|
|||
|
||||
rudvil |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 1 Всего: 3 |
Поначалу не так вас понял ![]() Согласен, спасибо ![]() Это сообщение отредактировал(а) rudvil - 7.4.2010, 17:13 --------------------
xor |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |