От новичка до гуру: Курсы программирования на CyberDuff

Разделенный интерфейс библиотеки (ChessGame с рисунками и т. д.) против закона пользователя об удалении каждого указателя

Иногда удобно разделить интерфейс некоторой системы/библиотеки более чем на один класс.

Например, рассмотрим идею библиотеки для игры в шахматы. Его интерфейс будет использовать (и доставлять игрокам) разные объекты для каждой отдельной игры и — во время игры — еще один объект для каждой фигурки.

В Java такой проблемы не было бы. Но в C++ пользователь библиотеки может удалить (или попытаться удалить) каждый указатель, который он получит. Даже shared_ptr/weak_ptr.

Что вы думаете о таких ситуациях? Должен ли я использовать в своем интерфейсе классы-оболочки, удаление которых не опасно?

Каков обычный путь для таких дилемм?

Есть ли способ, которым умные указатели STL помогут? Я слышал, что их следует использовать всегда и только для выражения права собственности, поэтому они, кажется, не имеют ничего общего с этой проблемой (Chess является владельцем SingleGame, SingleGame является владельцем каждого Figure).

PS я использовал правильные теги/тему?

02.07.2014

  • Какие?? Я действительно не понял проблемы.. если программист не может использовать C++, вы не можете спасти его от проклятия вечной памяти 03.07.2014
  • Простое правило - владелец удаляет. Поэтому, если вы отслеживаете право собственности с помощью интеллектуального указателя, вы можете отслеживать, кто несет ответственность за его удаление. 03.07.2014
  • Пользователь, который удаляет указатель, полученный с помощью интеллектуального указателя (например, std::shared_ptr), заслуживает того, чтобы самому получить остаток от отладки своего дрянного кода. 03.07.2014
  • Так что мне вообще не стоит беспокоиться о том, что кто-то слишком рано уничтожит какой-то объект? Я спрашиваю о хороших практиках. Я не хочу писать дрянной код. 03.07.2014
  • Да, рекомендуется не передавать необработанные указатели, используйте умные указатели вместо этого. 03.07.2014
  • @πάνταῥεῖ stackoverflow.com/questions/23408810/smart-pointers-cycles Вы не согласны с предложением: Подойдите к этому с концептуальной стороны, а не с точки зрения реализации. Умные указатели представляют собственность. И наличие интеллектуальных указателей не лишает законной силы роль необработанных указателей как наблюдателей, не являющихся владельцами. ? 03.07.2014

Ответы:


1

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

02.07.2014
  • Я знаю, пользователь всегда может написать что-то вроде int k; delete &k;, но я говорю о том, что мы можем рассматривать как часть публичного интерфейса. Последнее, о чем я думал, я хотел четко знать, как программисты смотрят на такие проблемы. Теперь я знаю, что это не очень важно. Хотя я нашел кое-что, что должно помочь кому-то педантичному: частный-оператор-удалить 03.07.2014

  • 2

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

    Но на самом деле ни один разумный программист на C++ не должен слепо вызывать delete при каждом полученном указателе. Когда они используют библиотеку/API/что-то еще, что возвращает указатель/дескриптор/ресурс/и т. д., они должны прочитать его документацию, чтобы сказать им, будут ли они нести ответственность за освобождение, и если да, то когда следует использовать технику.

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

    02.07.2014
    Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..