Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограничение используемой программой памяти, Ограничить спользуемую программой память 
V
    Опции темы
rudvil
Дата 3.4.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Нужно как-то ограничить используемую программой память, например как в php.
Выставил в настройках скажем "20 мб" и выше этой планки программа потреблять памяти не будет.
Насколько я понимаю, мне нужно перегрузить используемый мною оператор "new" / "delete", и при каждой попытке выделении памяти, увеличивать счетчик, ну и при удалении уменьшать счетчик соотвественно...
С "new" проблем не возникло...
Код
void* operator new (std::size_t size) {
    /*
    тут проверка - не превысется ли лимит... при malloc
    */
    currentMemory += size;
    void* mem = std::malloc(size);
    if (!mem)
        ail::fatal_error("\n[ALLOCATING FAILED]\n");
    return mem;
}

void* operator new[] (std::size_t size) {
    /*
    тут проверка - не превысется ли лимит... при malloc
    */
    currentMemory += size;
    void* mem = std::malloc(size);
    if (!mem)
        ail::fatal_error("\n[ALLOCATING FAILED]\n");
    return mem;
}

не могу нигде найти информацию по этому...
Код
void operator delete (void* mem) {
    std::free(mem);
}

void operator delete[] (void* mem) {
    std::free(mem);
}

т.е. как в этих случаях можно узнать размер удаляемого блока("mem")?
Чтобы можно было уменьшить счетчик используемой памяти...

з.ы. операторы перегружаю глобально
--------------------
xor
PM MAIL Skype   Вверх
586
Дата 3.4.2010, 02:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



PM   Вверх
rudvil
Дата 3.4.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(586 @ 3.4.2010,  01:37)
_msize

Спасибо, то что нужно  smile 
Но это как я понял только под винду =/ есть ли кроссплатформенные аналоги этой структуры?
--------------------
xor
PM MAIL Skype   Вверх
Rickert
Дата 3.4.2010, 16:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



А я бы не писал перегрузку new/delete - это слишком тонкая штука, с которой легко ошибиться.
Вместо этого я бы создал свои классы, которые бы сами выделяли память и чистили её, под определённые типы данных (массивы, списки т.п.)? при этом держали бы объём в постоянном сравнении с максимальной величиной. Кроссплатформенно и безопасно smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
rudvil
Дата 4.4.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(Rickert @ 3.4.2010,  15:35)
А я бы не писал перегрузку new/delete - это слишком тонкая штука, с которой легко ошибиться.
Вместо этого я бы создал свои классы, которые бы сами выделяли память и чистили её, под определённые типы данных (массивы, списки т.п.)? при этом держали бы объём в постоянном сравнении с максимальной величиной. Кроссплатформенно и безопасно smile

Возможно я так и поступлю, спасибо.
Хотелось бы узнать как можно ошибиться если я использую всеголишь malloc и free...?
--------------------
xor
PM MAIL Skype   Вверх
jonie
Дата 4.4.2010, 16:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



можно еще глянуть на альтернативные менеджеры памяти: http://stackoverflow.com/questions/858592/...mic-crt-linking

возможно, в них уже есть встроенные фичи, которые вам нужны...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
bsa
Дата 6.4.2010, 17:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(rudvil @  3.4.2010,  00:04 Найти цитируемый пост)
т.е. как в этих случаях можно узнать размер удаляемого блока("mem")?

Можно поступить так:
оператор new выделяет на 4 + sizeof(size_t) памяти больше, чем от него требуется. В первые четыре байта записывается некоторая сигнатура, затем записывается размер полезного блока памяти. Вызывающей функции возвращается указатель со смещением на 4 + sizeof(size_t) байт.
оператор delete проверяет сигнатуру удаляемого блока памяти, вычитает размер из счетчика, вызывает free.
Как вариант, можно сделать два вида сигнатур для new/delete и new[]/delete[] соответственно. Таким образом, будет дополнительная проверка правильности использования данных операторов.

Хотя, правильнее всего использовать "менеджеры" памяти, о которых говорил Rickert, тем более, что даже контейнеры STL их поддерживают.
PM   Вверх
rudvil
Дата 7.4.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(bsa @ 6.4.2010,  16:03)
Цитата(rudvil @  3.4.2010,  00:04 Найти цитируемый пост)
т.е. как в этих случаях можно узнать размер удаляемого блока("mem")?

Можно поступить так:
оператор new выделяет на 4 + sizeof(size_t) памяти больше, чем от него требуется. В первые четыре байта записывается некоторая сигнатура, затем записывается размер полезного блока памяти. Вызывающей функции возвращается указатель со смещением на 4 + sizeof(size_t) байт.
оператор delete проверяет сигнатуру удаляемого блока памяти, вычитает размер из счетчика, вызывает free.
Как вариант, можно сделать два вида сигнатур для new/delete и new[]/delete[] соответственно. Таким образом, будет дополнительная проверка правильности использования данных операторов.

Хотя, правильнее всего использовать "менеджеры" памяти, о которых говорил Rickert, тем более, что даже контейнеры STL их поддерживают.

А вот это уже интересно...
2bsa, ваш вариант понравился больше всего, начну его использовать.
Всем большое спасибо за помощь, решение найдено. smile
--------------------
xor
PM MAIL Skype   Вверх
rudvil
Дата 7.4.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Возник ещё 1 вопрос   smile , а именно - вот код
Код
void *malloc_hook(size_t size) {
    void *ptr = malloc(size + sizeof(size_t));
    *(size_t *) ptr = size;
    return ((size_t *) ptr) + 1;
}

void free_hook (void *ptr) {
    ptr = (void *) (((size_t *) ptr) - 1);
    free(ptr);
}

size_t report_size(void* ptr) {
    return * (((size_t *) ptr) - 1);
}
это реализация как-раз того о чем писал bsa.
Взято отсюда.
Код рабочий, всё ок.
Я только не пойму одного, зачем добавлять + 1 если мы и так уже сместили указатель выделяемого блока на (size_t*) ?

Это сообщение отредактировал(а) rudvil - 7.4.2010, 17:15
--------------------
xor
PM MAIL Skype   Вверх
bsa
Дата 7.4.2010, 14:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(rudvil @  7.4.2010,  13:08 Найти цитируемый пост)
Я только не пойму одного, зачем добавлять + 1 если мы и так уже сместили указатель выделяемого блока на (size_t*) ?
ткни пальцем в ту строку, где произошло первое смещение?
Кстати, я бы не изменял size на размер size_t, так как в последующих вычислениях придется постоянно вычитать.
PM   Вверх
rudvil
Дата 7.4.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(bsa @ 7.4.2010,  13:29)
Цитата(rudvil @  7.4.2010,  13:08 Найти цитируемый пост)
Я только не пойму одного, зачем добавлять + 1 если мы и так уже сместили указатель выделяемого блока на (size_t*) ?
ткни пальцем в ту строку, где произошло первое смещение?
Кстати, я бы не изменял size на размер size_t, так как в последующих вычислениях придется постоянно вычитать.

Извиняюсь, ступил... все верно.
А насчет вычислений, я не имею ничего против вычитаний. =]

Это сообщение отредактировал(а) rudvil - 7.4.2010, 15:46
--------------------
xor
PM MAIL Skype   Вверх
bsa
Дата 7.4.2010, 16:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(rudvil @  7.4.2010,  15:45 Найти цитируемый пост)
А насчет вычислений, я не имею ничего против вычитаний.
Это называется пессимизация - т.е. выполнение лишних операций.

PM   Вверх
rudvil
Дата 7.4.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(bsa @ 7.4.2010,  15:49)
Цитата(rudvil @  7.4.2010,  15:45 Найти цитируемый пост)
А насчет вычислений, я не имею ничего против вычитаний.
Это называется пессимизация - т.е. выполнение лишних операций.

Поначалу не так вас понял smile 
Согласен, спасибо  smile 


Это сообщение отредактировал(а) rudvil - 7.4.2010, 17:13
--------------------
xor
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0773 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.