В чем отличие между двумя функциями
MyClass* MyClass::foo()
{
MyClass* pa = new MyClass();
static MyClass* pt = pa;
return pt;
}
и
MyClass* MyClass::foo()
{
static MyClass* pt = new MyClass();
return pt;
}
Здравствуйте, wodan, Вы писали:
W>В чем отличие между двумя функциями
W>W>MyClass* MyClass::foo()
W>{
W> MyClass* pa = new MyClass();
W> static MyClass* pt = pa;
W> return pt;
W>}
W>
W>и
W>W>MyClass* MyClass::foo()
W>{
W> static MyClass* pt = new MyClass();
W> return pt;
W>}
W>
static MyClass* pt = new MyClass() выполняется только один раз, а MyClass* pa = new MyClass() — много.
Здравствуйте, wodan, Вы писали:
W>В чем отличие между двумя функциями
W>W>MyClass* MyClass::foo()
W>{
W> MyClass* pa = new MyClass();
W> static MyClass* pt = pa;
W> return pt;
W>}
W>
W>и
W>W>MyClass* MyClass::foo()
W>{
W> static MyClass* pt = new MyClass();
W> return pt;
W>}
W>
Выделенные строчки вызываются только 1ин раз независимо от кол-ва вызовов foo().
... << RSDN@Home 1.1.4 stable rev. 510>>
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, wodan, Вы писали:
W>>В чем отличие между двумя функциями
W>>W>>MyClass* MyClass::foo()
W>>{
W>> MyClass* pa = new MyClass();
W>> static MyClass* pt = pa;
W>> return pt;
W>>}
W>>
W>>и
W>>W>>MyClass* MyClass::foo()
W>>{
W>> static MyClass* pt = new MyClass();
W>> return pt;
W>>}
W>>
S>Выделенные строчки вызываются только 1ин раз независимо от кол-ва вызовов foo().
А что мешает их вызвать много раз?
Небезопасный код, возможны утечки памяти.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, srggal, Вы писали:
S>>Здравствуйте, wodan, Вы писали:
W>>>В чем отличие между двумя функциями
W>>>W>>>MyClass* MyClass::foo()
W>>>{
W>>> MyClass* pa = new MyClass();
W>>> static MyClass* pt = pa;
W>>> return pt;
W>>>}
W>>>
W>>>и
W>>>W>>>MyClass* MyClass::foo()
W>>>{
W>>> static MyClass* pt = new MyClass();
W>>> return pt;
W>>>}
W>>>
S>>Выделенные строчки вызываются только 1ин раз независимо от кол-ва вызовов foo().
А>А что мешает их вызвать много раз?
Я предполагаю, что Стандарт языка мешает этому.
А>Небезопасный код, возможны утечки памяти.
Спорить не буду, но напомню, что АТ спрашивал:
В чем отличие между двумя функциями
... << RSDN@Home 1.1.4 stable rev. 510>>
Здравствуйте, wodan, Вы писали:
W>В чем отличие между двумя функциями
W>W>MyClass* MyClass::foo()
W>{
W> MyClass* pa = new MyClass();
W> static MyClass* pt = pa;
W> return pt;
W>}
W>
W>и
W>W>MyClass* MyClass::foo()
W>{
W> static MyClass* pt = new MyClass();
W> return pt;
W>}
W>
1-я функция совершенно неправильная(точнее ошибочная), при повторном вызове она явным образом приводит к утечке памяти т.к.
во время первого вызова происходит выделение области памяти под объект MyClass на которую начинает указывать указатель pa. И тут же происходит первая и единственная инициализация статического указателя pt, в который записывается указатель на выделенную память. После он спокойно возвращается функцией.
Если же эту функцию вызвать второй раз, то снова выделется память записывается в указатель pa, но вторая строчка уже не выполняется, таким образом из функции возвратится уже указатель не указывающий на сново выделеную память.
А во 2-й только единажды выделяется память и инициализируется указатель pt;
Таким образом можно назвать не только отличия, но и сходства, а именно — эти функции только один раз возвращают указатель на вновь выделенную память, в последующих вызовах из них ничего доброго не вытянешь.