Пишу библиотеку и демонстрационный проект. Проекту все равно, какую версию библиотеки я использую (я могу использовать sdl, directx или все, что мне нравится в качестве бэкэнда gfx). Чтобы получить объект, я делаю
Obj *obj = libname_newDevice();
Теперь я должен использовать удаление или мне следует сделать obj->deleteMe();? Я спрашиваю, потому что я точно не делаю нового, поэтому мне не следует делать удаление?
У меня есть obj->create(theType);, который возвращает класс с интерфейсом Obj.
Мой реальный вопрос: нужен ли мне libname_deleteDevice(); или obj->deleteMe() в порядке, так как у меня есть deleteMe в интерфейсе?





Поскольку вы абстрагируете создание внутри libname_newDevice() (что, я должен сказать, не очень хороший подход), вам следует уничтожить, используя что-то вроде libname_destroyDevice (obj).
И, как подсказывает комментарий Мартина, лучше всего поместить их в конструктор и деструктор пользовательского класса, который вам просто нужно создать в стеке, а компилятор позаботится обо всем остальном.
Пожалуйста, попробуйте прояснить свой вопрос. Мне это совершенно непонятно.
Хорошая практика - иметь фабрику объектов для создания объекта. Я предполагаю, что это роль libname_newDevice().
Библиотека также должна обеспечивать способ удаления объекта (например, obj->DeleteMe() или libname_Delete(obj)).
Не полагайтесь на C++ delete: вызывающий объект и библиотека могли быть скомпилированы с другой версией компилятора, который будет делать разные вещи в отношении распределения памяти и ресурсов. Поэтому безопаснее, если ваша библиотека удалит созданный ею объект.
Думаю, графика не актуальна. В частности, я хочу знать, следует ли мне выполнять libname_Delete () или делать obj-> DeleteMe (); У меня также есть obj-> create (theType);
Безопаснее (в Windows), если библиотека удаляет созданные ею объекты. Но ваши аргументы в пользу этого ошибочны.
Вы определенно не хотите реализовывать Obj :: deleteMe (). Это должно было бы сделать что-то вроде:
delete this;
пока вы все еще были внутри this-> deleteMe (). Следуйте предложению Jaywalker'а и заставьте функцию destroy использовать Obj * в качестве параметра.
"удалить это;" может вызвать мурашки по коже, но это не обязательно плохо. Объекты, которые реализуют собственный подсчет ссылок, всегда должны это делать. Примеры см. В разделе Release () в каждой «моей первой реализации COM».
Я думаю, что лучше всего было бы соблюдать RAII и иметь некоторый объект-оболочку для подсчета ссылок (вы даже можете использовать shared_ptr с настраиваемым освободителем).
Я бы пошел еще дальше. Если вы используете фабричную функцию для создания, может быть логичным использовать фабричную функцию для уничтожения. В дополнение к этому, чтобы все было красиво и безопасно, оберните в объект.
class ObjWrap
{
public:
ObjWrap()
:obj(libname_newDevice())
{}
~ObjWrap()
{ libname_deleteDevice(obj);}
private:
ObjWrap(ObjWrap const&); // Dont copy
void operator=(ObjWrap const&); // Dont copy
Obj* obj;
}; // If you want to copy then you need to extra work on ref counting
// This may need some form of smart pointer.
Да, симметрия - это хорошо. Затем вы должны обернуть все это внутри объекта, где эти две функции вызываются конструктором / деструктором.