Existe um 'ownership-in-a-package' apropriado para 'handles' disponíveis?
Alças tem semântica adequada diferente de ponteiros. Então, para mim, um exemplo como esse (extraído doRegra do zero):
class module {
public:
explicit module(std::wstring const& name)
: handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {}
// other module related functions go here
private:
using module_handle = std::unique_ptr<void, decltype(&::FreeLibrary)>;
module_handle handle;
};
usandounique_ptr
como um 'ownership-in-a-package' para handles é um mau exemplo. Primeiro, faz uso do conhecimento interno de que o handle é um tipo de ponteiro, e usa isso para fazer umunique_ptr
para o tipo básico o tipo de identificador "opaco" é construído.
As alças podem ser de qualquer tipo, podem ser um ponteiro, podem ser um índice ou quem sabe. Mais importante ainda, o que você tem em mãos (da maioria das APIs C, por exemplo) é um identificador e sua função de liberação de recursos.
Existe uma 'propriedade-em-um-pacote' adequada quetrabalho na semântica de identificador? Quero dizer, já publicamente disponível para um usar?
Para mim,unique_ptr
et. al. não funciona, devo fazer suposições desnecessárias sobre o tipo de alçaé, quando o que eu quero é apenas obter um 'ownership-in-a-package' através do tipo de identificador opaco e sua função de liberação, unicamente.
Não faz sentido que alguém entre no tipo de alça para fazer construções sobre essa informação. É uma alça, não importa.
Vou citar aqui os sentimentos de outro usuário SO emoutra pergunta responda:
Crie uma classe "ponteiro inteligente" específica, não demorará muito. Não abuse das aulas da biblioteca. A semântica do identificador é bem diferente da de um ponteiro C ++; por um lado, desreferenciar um HANDLE não faz sentido.
Mais um motivo para usar uma classe de identificador inteligente personalizada - NULL nem sempre significa um identificador vazio. Às vezes, é INVALID_HANDLE_VALUE, que não é o mesmo.
Aviso Legal:
Esta questão reformula e se baseia nessa:
Onde está a Regra de Zero adequada (manipulação de recursos)?