Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > operator new()


Автор: MAKCim 28.1.2006, 10:05
есть вопрос
Код

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?

Автор: Daevaorn 28.1.2006, 10:35
MAKCim
Конструктор не вызваться не может, это же закон. Смысл перегрузки - это контроль за выделением памяти и возможность запустить всякий служебный код, на стандартное поведение с вызовом конструктора ты повлиять не можешь, хоть перегружай для каждого класса, хоть глобально.

Автор: MAKCim 28.1.2006, 11:05
Цитата

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

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

A* a=new A;

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

Автор: Daevaorn 28.1.2006, 11:13
Цитата(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 каким-то особым способом, то это, возможно, приведет к утечке памяти если конструктор захватывает какой-нибудь ресурс.

Не преведет. Это ни как не зависит.

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

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

Автор: dronzo 28.1.2006, 13:11
MAKCim, посмотри здесь :
http://groups.google.ru/group/alt.comp.lang.learn.c-c++/msg/d51cc7f948e67bea
http://groups.google.ru/group/comp.lang.c++.moderated/msg/88fb52f8800fb65b
Лучше и точнее вряд ли скажешь, имхо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)