пятница, 3 сентября 2010 г.

Функция set_new_handler

Нашел интересный метод в С++.
Называется set_new_handler и призван помочь нам в случае если не получилось выделить память.
Описание можно глянуть тут и тут
Ниже пример использования:

#include "stdafx.h"
#include
using namespace std;

void no_memory()
{
printf( "Failed to allocate memory!\n");
throw bad_alloc();
}

int _tmain(int argc, _TCHAR* argv[])
{
set_new_handler(no_memory);
while(1)
{
try
{
int* p = new int[1024*1024*256];
printf("successed\n");
}
catch(bad_alloc b)
{
return 0;
}
}
//delete []p;
return 0;
}

Сразу же возникает закономерный вопрос: а как же его использовать в практическом коде?
А ответ прост - никак.

На проекте может быть два способа работы с памятью:
  • ленивый - все отдается на откуп стандартному new и надеемся, что памяти у пользователя всегда хватит.
  • практичный - команда берет на себя все управление памятью, каждый байт подсчитан и задокументирован.
Начнем со второго случая. Если команда взяла на себя управление памятью, то new переопределен и стало быть метод установленный вызовом set_new_handler никогда не сработает. Да и не нужен он, при нормально написанном менеджере памяти.

В первом же случае, если команда дошла до точки, когда закончилась память и приходиться использовать set_new_handler, то это значит, что пора задумываться о втором случае. Пора садиться считать байты и брать управление памятью на себя. set_new_handler - это всего лишь заплатка, "гвоздь", который поможет пережить текущий майлстоун, но сдавать проект с ним нельзя.

Доброй всем ночи.

1 комментарий:

  1. Јас сум тука да го споделам своето сведоштво за тоа што направи добра доверлива компанија за заем за мене. Јас се викам Никита Тања, од руски и сум прекрасна мајка на 3 деца што ги изгубив средствата во обидот да добијам заем беше толку тешко за мене и за моите деца, отидов на Интернет да барам помош за заем, сета надеж беше изгуби се до еден верен ден кога го запознав мојот пријател кој неодамна обезбеди заем од многу чесен човек г-дин, Бенџамин. Таа ме запозна со овој искрен заем за заеми г-дин, Бенџамин, кој ми помогна да добијам заем во рок од 5 работни дена, засекогаш ќе бидам благодарен на г-дин Бенџамин, за тоа што ми помогна повторно да се вратам на нозе. Можете да контактирате со г-дин Бенџамин преку е-пошта: Lfdsloans@outlook.com тие не знаат дека го правам ова за нив, но јас само треба да го направам тоа затоа што многу луѓе се таму, на кои им е потребна помош за заем, ве молиме дојдете на овој чесен човек и вие можете да бидете спаси. WhatsApp: (+ 1 989-394-3740)

    ОтветитьУдалить