Как только Вы приняли интеллектуальные указатели повышения, есть ли какой-либо случай, где Вы используете необработанные указатели?

Вам не хватает подчеркивания в сигнатуре функции. Попробуйте

func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
return false
}

Но я не думаю, что этот метод делает то, что вам нужно.

См. https://developer.apple.com/library/archive/qa/qa1838/_index.html для одного из решений Apple

.

12
задан ApplePieIsGood 12 December 2008 в 16:47
поделиться

10 ответов

Только некоторые первое, что пришло на ум:

  • Навигация вокруг в файлах с отображенной памятью.
  • Windows API calls, где необходимо сверхвыделить (как LPBITMAPINFOHEADER).
  • Любой код, где Вы портите вокруг в произвольной памяти (VirtualQuery () и т.п.).
  • Примерно любое время Вы используете reinterpret_cast <> на указателе.
  • Любое время Вы используете новый для размещения.

Общая нить здесь является "любой ситуацией, в которой необходимо рассматривать часть памяти как что-то другое, чем ресурс, над которым Вы имеете контроль выделением".

6
ответ дан 2 December 2019 в 04:54
поделиться

Я не использую shared_ptr почти вообще, потому что я избегаю совместно использованного владения в целом. Поэтому я использую что-то как boost::scoped_ptr "владеть" объектом, но всеми другими ссылками на него будет необработанными указателями. Пример:

boost::scoped_ptr<SomeType> my_object(new SomeType);
some_function(my_object.get());

Но some_function будет иметь дело с необработанным указателем:

void some_function(SomeType* some_obj)
{
  assert (some_obj);
  some_obj->whatever();
}
7
ответ дан 2 December 2019 в 04:54
поделиться

В эти дни я в значительной степени отказался от всего использования необработанных указателей. Я даже начал просматривать нашу кодовую базу для мест, где необработанные указатели использовались и переключили их на вариант интеллектуального указателя. Удивительно, сколько кода я смог удалить путем совершения этого простого поступка. Существует так много кода, потраченного впустую на пожизненное управление необработанными указателями C++.

Единственные места, где я не использую указатели, для нескольких interop сценариев с другими кодовыми базами, которыми я не управляю.

4
ответ дан 2 December 2019 в 04:54
поделиться

Я нахожу главную разницу между 'современным' C++ и старым*, материал является тщательным использованием инвариантов класса и инкапсуляцией. Хорошо организованный код имеет тенденцию естественно иметь меньше суетящихся указателей. Я почти как нервное плавание в shared_ptrs, как я был бы в новостях и удаляю.

Я с нетерпением жду unique_ptr в C++ 0x. Я думаю, что это уберет несколько (умных) указателей, которые действительно все еще перемещаются дикая местность.

*все еще, к сожалению, очень распространенный

4
ответ дан 2 December 2019 в 04:54
поделиться

Конечно, любое время, Вы имеете дело с библиотекой прежней версии или API, необходимо будет передать необработанный указатель, хотя Вы, вероятно, просто извлечете его из своего интеллектуального указателя временно.

На самом деле всегда безопасно передать необработанный указатель на функцию, пока функция не пытается сохранить копию указателя в глобальной переменной или членской переменной, или попытаться удалить его. С этими ограничениями на месте, функция не может влиять на время жизни объекта, и единственная причина интеллектуального указателя состоит в том, чтобы управлять объектным временем жизни.

4
ответ дан 2 December 2019 в 04:54
поделиться

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

2
ответ дан 2 December 2019 в 04:54
поделиться

Если у Вас есть круговые структуры данных, например, точки к точкам B и B назад к A, Вы не можете использовать наивно интеллектуальные указатели использования и для A и для B, с тех пор объекты будут только освобождены дополнительная работа. Для освобождения памяти необходимо вручную очистить интеллектуальные указатели, который является почти настолько же плохо, как удаление интеллектуальных указателей избавляется от.

Вы могли бы вещь это не происходить очень часто, но предполагать, что у Вас есть Родительский объект, который имеет интеллектуальные указатели к набору Дочерних объектов. Где-нибудь по пути кто-то должен искать Родителя для Ребенка, таким образом, они добавляют участника интеллектуального указателя к Ребенку, который указывает назад на родителя. Тихо, память больше не освобождается.

Некоторый уход требуется. Интеллектуальные указатели не эквивалентны сборке "мусора".

1
ответ дан 2 December 2019 в 04:54
поделиться

Я все еще использую регулярные указатели в чувствительном к ресурсу коде или другом коде, для которого нужно крошечное место, такое как определенные исключения, где я не могу предположить, что любые данные допустимы и должны также предположить, что у меня заканчивается память также.

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

О, и существует еще одно место для использования необработанных указателей:

boost::shared_ptr<int> ptr(new int);
2
ответ дан 2 December 2019 в 04:54
поделиться

Не то, чтобы я сделал бы это, но Вам нужны необработанные указатели для реализации, скажем, связанного списка или графика. Но было бы намного более умно использовать std::list<> или boost::graph<>.

0
ответ дан 2 December 2019 в 04:54
поделиться

Я пишу C++, который должен сосуществовать с Objective C (использующий Objective C ++ для образования моста). Поскольку объекты C++ объявили как часть Objective C ++, классам не вызвали конструкторов или деструкторы, Вы не можете действительно держать их там в интеллектуальных указателях.

Таким образом, я склонен использовать необработанные указатели, хотя часто с повышением:: intrustive_ptr и внутреннее касательно количества.

1
ответ дан 2 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: