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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator new() 
:(
    Опции темы
MAKCim
Дата 28.1.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



есть вопрос
Код

class A
{
private:
    A() {}
public:
    void* operator new(unsigned int size) {}
};

...
int main()
{
    A* a=new A;          //1
    return 0;
}

почему в 1 требуется конструктор A()?, ведь оператор-то перегружен или конструктор по-любому необходим для перегрузки operator new
и еще
Код

class A
{
public:
    A() {std::cout<<"A()"<<std::endl;}
    void* operator new(unsigned int size) {std::cout<<"operator new()"<<std::endl;}
};

...
int main()
{
    A* a=new A;
    return 0;
}

печатает:
operator new()
A()
почему конструктор вызывается неявно, какой тогда смысл в перегрузке new?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


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

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



MAKCim
Конструктор не вызваться не может, это же закон. Смысл перегрузки - это контроль за выделением памяти и возможность запустить всякий служебный код, на стандартное поведение с вызовом конструктора ты повлиять не можешь, хоть перегружай для каждого класса, хоть глобально.
PM MAIL WWW   Вверх
MAKCim
Дата 28.1.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Смысл перегрузки - это контроль за выделением памяти и возможность запустить всякий служебный код

как я могу контролировать память?
допустим
Код

A* a=new A;

судя по примеру 2 сначала вызовется operator new(), и что я могу здесь контролировать при отсутствии объекта?
если я в operator new() буду выделять память для A каким-то особым способом, то это, возможно, приведет к утечке памяти если конструктор захватывает какой-нибудь ресурс.


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


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

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



Цитата(MAKCim @ 28.1.2006, 11:05 Найти цитируемый пост)

как я могу контролировать память?

В твоем пример контроль заключается в том, что ты её не выделяешь и просто печатаешь информациюsmile

Цитата(MAKCim @ 28.1.2006, 11:05 Найти цитируемый пост)

судя по примеру 2 сначала вызовется operator new(), и что я могу здесь контролировать при отсутствии объекта?

Код

 void* operator new(unsigned int size) {
       std::cout<<"operator new()"<<std::endl;
       return malloc( size );
       }


Вот выделили память и вывели информацию. Может пригодится для отладки. На таком принципе основано написание своего менеджера памяти.
Цитата(MAKCim @ 28.1.2006, 11:05 Найти цитируемый пост)

если я в operator new() буду выделять память для A каким-то особым способом, то это, возможно, приведет к утечке памяти если конструктор захватывает какой-нибудь ресурс.

Не преведет. Это ни как не зависит.
PM MAIL WWW   Вверх
Void
Дата 28.1.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(MAKCim @ 28.1.2006, 13:05 Найти цитируемый пост)
если я в operator new() буду выделять память для A каким-то особым способом, то это, возможно, приведет к утечке памяти

Так в этом случае нужно и operator delete() перегружать.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
dronzo
Дата 28.1.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, посмотри здесь :
http://groups.google.ru/group/alt.comp.lan...51cc7f948e67bea
http://groups.google.ru/group/comp.lang.c+...8fb52f8800fb65b
Лучше и точнее вряд ли скажешь, имхо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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