Выделение памяти
От: wodan  
Дата: 19.12.05 14:43
Оценка:
В чем отличие между двумя функциями

MyClass* MyClass::foo()
{
   MyClass* pa = new MyClass();
   static MyClass* pt = pa;
   return pt;
}


и


MyClass* MyClass::foo()
{
    static MyClass* pt = new MyClass();
    return pt;
}
Re: Выделение памяти
От: KBH  
Дата: 19.12.05 14:47
Оценка:
Здравствуйте, wodan, Вы писали:

Хм, отличий мало, но обе опасные...
Re: Выделение памяти
От: last_hardcoder  
Дата: 19.12.05 14:48
Оценка:
Здравствуйте, 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() — много.
Re: Выделение памяти
От: srggal Украина  
Дата: 19.12.05 14:48
Оценка:
Здравствуйте, 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>>
Re[2]: Выделение памяти
От: Аноним  
Дата: 19.12.05 18:35
Оценка:
Здравствуйте, 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().


А что мешает их вызвать много раз?

Небезопасный код, возможны утечки памяти.
Re[3]: Выделение памяти
От: srggal Украина  
Дата: 19.12.05 18:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, 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>>
Re: Выделение памяти
От: alexsoff Россия  
Дата: 19.12.05 20:42
Оценка: 1 (1)
Здравствуйте, 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;
Таким образом можно назвать не только отличия, но и сходства, а именно — эти функции только один раз возвращают указатель на вновь выделенную память, в последующих вызовах из них ничего доброго не вытянешь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.