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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно перегрузить оператор new и delete 
:(
    Опции темы
Riddik
Дата 11.4.2009, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

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



Как перегрузить new с использованием обычного new, а не malloc в этом случае:
Код

#include <new>
#include <iostream>

class A{
 int x,y,z;
public:
 A(){x=y=z=0;}
 A(int i, int j, int k) {x=i; y=j; z=k;} 
 
 void *operator new(size_t size);
 void operator delete (void *p);
};

void *A::operator new(size_t size)
{
  void *p;
  p=malloc(size);
  if(!p) {bad_alloc ba; throw ba;}
  return p;
}

void A::operator delete(void *p)
{
 free(p);
}

int main()
{
 A *a;
 try{
  a=new A(5, 3, 7);
 }
 catch(bad_alloc ba) {std::cout<<"Память не выделить!\n"; exit(1);}
 ...
 delete a;
 return 0;
}


Это сообщение отредактировал(а) Riddik - 11.4.2009, 01:54
PM MAIL   Вверх
Kipter
Дата 11.4.2009, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 2.5.2006

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



попробуйте

Код

void *A::operator new(size_t size)
{
  void *p;
  p = ::new char[size];
  if(!p) {bad_alloc ba; throw ba;}
  return p;
}

PM MAIL   Вверх
J0ker
Дата 11.4.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



это не правильная реализация
bad_alloc выбрасывает new_handler который должен вызываться после неудачного аллокирования через стандартные функции - и все это должно идти в цикле пока либо new/malloc не выделит память, либо new_handler не сдохнет или бросит bad_alloc


--------------------
user posted image
PM MAIL   Вверх
zim22
Дата 11.4.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Riddik @  11.4.2009,  01:52 Найти цитируемый пост)
Как перегрузить new с использованием обычного new, а не malloc в этом случае:

почитайте Мейерса Effective C++ 2 ed. (Эффективное использование С++. 50 рекомендаций) Глава 2. Управление памятью.


--------------------
PM MAIL   Вверх
Riddik
Дата 11.4.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

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



Спасибо. Как раз эта книга мне по почте пришла, надо забрать smile
PM MAIL   Вверх
zim22
Дата 11.4.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Riddik, вы второе издание заказывали? зря. уже третье давно есть.


--------------------
PM MAIL   Вверх
Cтpaнник
Дата 11.4.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 12.10.2008
Где: Россия, Санкт-Пет ербург

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



Цитата(Kipter @ 11.4.2009,  05:45)
Код
  p = ::new char[size];
  if(!p) {bad_alloc ba; throw ba;}


Это неправильный код. По Стандарту (и последние компиляторы ему следуют - GCC 4.3-4.4, MSVC++ 2005-2008, BCC 5.5) если глобальный оператор new не смог выделить запрошенный объем памяти, то он сам выбрасывает исключение std::bad_alloc. Таким образом, до {bad_alloc ba; throw ba;} поток выполнения не дойдет в любом случае.

Если хочется написать подобный код, то нужно явно использовать new(nothrow).
PM MAIL   Вверх
Riddik
Дата 11.4.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

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



zim22, , всё в порядке, вот эту книгу я заказал. Заберу через несколько дней smile


Это сообщение отредактировал(а) Riddik - 11.4.2009, 12:23
PM MAIL   Вверх
zim22
Дата 11.4.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



 smile 
Riddik, сколько она вам обошлась? 
(может я переплатил...)

Это сообщение отредактировал(а) zim22 - 11.4.2009, 12:21


--------------------
PM MAIL   Вверх
Riddik
Дата 11.4.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

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



zim22, я несколько книг вместе заказал. Если считать отдельно, то рублей 250-280.
PM MAIL   Вверх
zim22
Дата 11.4.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Riddik, мда... я за 500 брал на местном радио-базаре smile


--------------------
PM MAIL   Вверх
Riddik
Дата 11.4.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

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



zim22, думаю, она всё равно этого стоит smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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