четверг, 7 октября 2010 г.

Мобильная тема

Всем доброго вечера.
Настроил себе мобильный интернет для evernote, а заодно и для блога.

--
Надіслано з мого мобільного пристрою

пятница, 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 - это всего лишь заплатка, "гвоздь", который поможет пережить текущий майлстоун, но сдавать проект с ним нельзя.

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

четверг, 5 августа 2010 г.

Final class в C++ 2

Месяц назад написал статью Final class в C++, в которой пытался решить проблему с запретом наследования в С++. Проблема решилась, но при этом возникло два вопроса.

Для опытных программистов эти вопросы не очень сложные, но написать ответы считаю нужным. Обещал все-таки.

С первым все достаточно просто. И звучит он следующим образом: "Почему переопределенные операторы new/delete не имеют доступа к приватным конструктору и деструктору?".
Ответ: потому, что конструктор и деструктор вызываются не из операторов new/delete, их вызывает внешний код, который встраивается компилятором.

Второй вопрос повеселее: "Почему именно виртуальное наследование запрещает наследование от класса объявленного финальным?"
Ответ находится по ссылке С++ Faq. Если по-русски то суть в том, что если в цепочке родителей есть виртуальное наследование, то наследник должен иметь прямой доступ к конструктору данного класса: constructors for virtual base classes anywhere in your class's inheritance hierarchy are called by the "most derived" class's constructor.

Всем доброй ночи.