Страница:
116 из 357
Например:
char* save_string(char* p) (* char* s = new char[strlen(p)+1]; strcpy(s,p); return s; *)
Следует заметить, что чтобы освободить пространство, вделенное new, delete должна иметь возможность определить размер выделенного объекта. Например:
int main(int argc, char* argv[]) (* if (argc « 2) exit(1); char* p = save_string(argv[1]); delete p; *)
Это приводит к тому, что объект, выделенный стандартной реализацией new, будет занимать больше места, чем статический объект (обычно, больше на одно слово).
Можно также явно указывать размер вектора в операции уничтожения delete. Например:
int main(int argc, char* argv[]) (* if (argc « 2) exit(1); int size = strlen(argv[1])+1; char* p = save_string(argv[1]); delete[size] p; *)
Заданный пользователем размер вектора игнорируется за исключением некоторых типов, определяемых пользователем (#5.5.5).
Операции свободной памяти реализуются функциями (#с.7.2.3):
void operator new(long); void operator delete(void*);
Стандартная реализация new не инициализирует возвращамый объект.
Что происходит, когда new не находит памяти для выделния? Поскольку даже виртуальная память конечна, это иногда должно происходить. Запрос вроде
char* p = new char[100000000];
как правило, приводит к каким-то неприятностям. Когда у new ничего не получается, она вызывает функцию, указываемую указателем _new_handler (указатели на функции обсуждаются в # 4.6.9). Вы можете задать указатель явно или использовать функцию set_new_handler(). Например:
#include «stream.h»
void out_of_store()
(* cerr «„ «операция new не прошла: за пределами памяти\n“; exit(1); *)
typedef void (*PF)(); // тип указатель на функцию
extern PF set_new_handler(
|< Пред. 114 115 116 117 118 След. >|