4 Réponses :
Si j'ai bien compris, je passe l'adresse de la variable qui stocke 0x123456?
Oui, vous avez bien compris. Vous transmettez l'adresse d'une variable qui contient une autre adresse.
Pourquoi la fonction en a besoin?
Dans la plupart des cas, une fonction déclare un pointeur vers un pointeur en tant que paramètre lorsque l'argument passé à cette fonction est normalement un pointeur de par sa conception et que la fonction doit modifier l'argument lui-même (dans votre exemple, la variable qui contient 0x123456
).
Comment puis-je le transmettre à av_hwdevice_ctx_create? Parce que j'obtiens une erreur quand je le fais
Vous ne devriez pas. Cette fonction laisse à l'appelant la responsabilité de libérer la mémoire après utilisation, cependant si vous voulez vraiment faire cela, vous pouvez assigner une variable avec unique_ptr.get ()
puis passer l'adresse de cette nouvelle variable (ce qui brisera toute l'idée du pointeur intelligent que vous utilisez - dans ce cas particulier, vous devriez utiliser un pointeur brut).
Comme vous l'avez écrit, lorsque vous passez le pointeur vers quelque chose, la fonction peut modifier les données de l'objet / mémoire vers lequel le pointeur pointe. Mais vous, c'est-à-dire votre application, devez allouer la mémoire elle-même.
Lorsque vous transmettez l'adresse d'un pointeur, la fonction appelée peut allouer la mémoire elle-même et renvoyer l'objet ou la mémoire nouvellement allouée via le pointeur.
Btw .: Lisez la documentation si votre application doit à nouveau libérer de la mémoire!
Merci, je sais que j'ai besoin de libérer la mémoire allouée, j'utilise un suppresseur unique_ptr personnalisé pour cela, je n'ai simplement pas ajouté l'exemple. Mais savez-vous comment je passe une référence à un pointeur quand il est à l'intérieur d'un unique_ptr? Comme vous pouvez le voir dans ma question, je ne peux pas faire & myUniquePtr.get ()
@GuerlandoOCs vous pouvez affecter le retour de myUniquePtr.get () à l'intérieur d'une nouvelle variable, puis passer à la fonction l'adresse de cette nouvelle variable. Cependant, je pense qu'il est plus logique d'utiliser un pointeur brut dans ce cas.
Oui, utilisez d'abord un pointeur brut, et seulement lorsque vous récupérez le pointeur, attribuez-le à std :: unique_ptr ()
pour vous assurer qu'il est supprimé.
Lorsque vous passez un pointeur, vous passez le pointeur par valeur. Vous pouvez donc modifier la variable vers laquelle pointe le pointeur mais pas le pointeur lui-même.
Si vous aviez besoin de modifier le pointeur lui-même (par exemple pointer vers un autre endroit), vous le transmettez par référence ou par pointeur sur le pointeur.
La raison pour laquelle la référence de unique_ptr ne fonctionne pas est que vous essayez d'obtenir une référence d'un temporaire qui mourra immédiatement. Si la fonction accepte un const ref, cela fonctionnerait, mais ce n'est évidemment pas ce que vous essayez d'accomplir.
Vous ne devez PAS modifier un pointeur qui est géré par un pointeur intelligent. Vous pouvez passer le pointeur vers le pointeur intelligent après l'appel de la fonction.
Il en a besoin pour la même raison qu'une fonction qui veut modifier un int
doit se voir passer un pointeur (ou une référence) vers un int
modifiable.
Autrement dit, votre situation est la même que
AVBufferRef *hw_device_ctx = NULL; if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type, NULL, NULL, 0)) < 0) { .. } else { std::unique_ptr<AVBufferRed> hw_pointer(hw_device_ctx); ... }
Si vous souhaitez gérer la durée de vie avec un unique_ptr
, laissez la fonction créer l'objet d'abord, puis en céder la propriété au unique_ptr
:
int f() { return 0; } void foo(int* x) { *x = 1; } ... foo(&f());
Lisez la documentation des paramètres: ffmpeg.org/doxygen/3.2/…
Notez également que vous devez appeler une fonction spéciale pour la détruire, donc votre unique_ptr normal ne fonctionnera pas.
La fonction de création de contexte souhaite affecter un pointeur unique à
AVBufferRef *
dans la fonction appelante, il doit donc être passé un pointeur vers ce pointeur pour pouvoir effectuer la modification.En relation: Passer une référence à des pointeurs en C ++
@ user202729 merci, j'utilise un suppresseur personnalisé, je n'ai tout simplement pas ajouté l'exemple