1
votes

Quel est l'intérêt de passer l'adresse du pointeur à la fonction qui a besoin du pointeur au pointeur?


5 commentaires

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


4 Réponses :


0
votes

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).


0 commentaires

0
votes

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!


3 commentaires

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é.



1
votes

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.


0 commentaires

1
votes

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());


0 commentaires