2013-03-18 2 views
2

Я новичок в C++, а также умный указатель. У меня такой код.понимание умного указателя boost в C++

Example* Example::get_instance() { 
     Example* example = new Example(); 
     return example; 
} 

Я пытаюсь преобразовать его в смарт-указатель, как этот

shared_ptr<Example> Example::get_instance() { 
     shared_ptr<Example> example (new Example()); 
     return example; 
} 

Является ли это правильный путь, потому что, когда я пытаюсь вызвать это из другого класса его не working.I пытаюсь реализовать одноэлементный объект.

+0

Что именно не работает? –

+0

Что не работает? И это определенно не способ создать синглтон. Каждый вызов 'get_instance' создаст новый экземпляр вашего * singleton *. – Praetorian

+0

да, я понимаю это. Я спрашиваю, могу ли я вернуть общий указатель, как это?shared_ptr Пример :: get_instance() или нужно сделать это, как этот Пример * Пример :: get_instance() { – Kathick

ответ

1

Вы создаете новый объект Example каждый раз, когда объект запрашивается. Это утечка памяти, вы также каждый раз возвращаете другой объект. Попробуйте вместо этого:

Example & Example::get_instance() { 
     static Example example; 
     return example; 
} 

Также обратите внимание на следующие советы для вашего кода:

  • при создании интеллектуальных указателей предпочитают make_shared вместо shared_ptr<YourType>(new YourType(...)). Причина, по которой можно найти here. Соответствующая выдержка:

    Эта функция, как правило, выделяет память для объекта T и блок управления shared_ptr с одной выделением памяти (это необязательного требования в стандарте). Напротив, декларация std :: shared_ptr p (new T (Args ...)) выполняет как минимум две ячейки памяти , которые могут нести лишние накладные расходы. Кроме того, f (shared_ptr (new int (42)), g()) может привести к утечке памяти, если g выдает исключение. Эта проблема не существует, если используется make_shared .

  • понять разницу между std::unique_ptr и std::shared_ptr. Для вашего случая, std::unique_ptr было бы лучше, но есть еще более простое решение вашей проблемы, которое я показал выше.

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

  • и, наконец, вы действительно хотите синглтон? Мне просто нужно спросить. Я работаю полный рабочий день в качестве программиста уже почти 4 года. Не так давно, я знаю, но достаточно, чтобы столкнуться с ситуацией, когда я пожалел, что я или кто-то другой использовал шаблон Singleton вместо передачи ссылки на мой объект по цепочке вызовов.

Try, чтобы избежать одиночек, вы можете позже найти свой код, используя одноплодной может в конце концов хотят работать на нескольких экземпляров вашего Example объекта вместо вызова Пример :: get_instance и работать только на что единичные случаи. Поэтому, когда у вас будет это откровение (и это может быть только вопрос времени), у вас будет большой рефакторинг впереди вас.

Итак, «Осторожно, там будут драконы!».

+1

Или забудьте о булевом и умном указателе, создайте статический экземпляр объекта внутри функции и верните ссылку (или указатель) на нее. При попытке реализовать синглтон нет необходимости привлекать интеллектуальные указатели. – Praetorian

+0

true, true :)) Работал над кодом OPs и не видел лес с деревьев. –

+0

спасибо, отредактировал мой ответ. Я думаю, что ссылки лучше. : D –

Смежные вопросы