[英]What's the point of passing address of pointer to function that needs pointer to pointer?
我正在阅读ffmpeg解码的示例,它具有将指针的地址传递给函数的地址:
static AVBufferRef *hw_device_ctx = NULL;
if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type,
NULL, NULL, 0)) < 0) {
将指针的地址作为参数传递的意义何在?
我了解,当我们传递指针本身时,如果指针的地址为0x123456
,则该函数将能够修改此地址中的对象。 但是,当我传递指针的地址时,我传递的是分配该指针号的地址?
如果我理解正确,我正在传递存储0x123456
的变量的地址? 为什么功能需要它?
另外,假设我想将hw_device_ctx
存储在如下的unique_ptr
:
std::unique_ptr<AVBufferRed> hw_pointer;
如何将其传递给av_hwdevice_ctx_create
? 因为我做错事
av_hwdevice_ctx_create(&hw_pointer.get(),...
它说:
expression must be an lvalue or a function designator
传递指针时,按值传递指针。 因此,您可以修改指针指向的变量,但不能修改指针本身。
如果您需要修改指针本身(例如,指向其他地方),则可以通过引用或指针传递它。
引用unique_ptr不起作用的原因是,您正在尝试获取将立即死亡的临时引用。 如果函数接受const ref,它将起作用,但显然这不是您要实现的目标。
您不应修改由智能指针管理的指针。 您可以在函数调用后将指针传递给智能指针。
出于同样的原因,需要将想要修改int
的函数传递给可修改int
的指针(或引用),这也是出于同样的原因。
也就是说,您的情况与
int f() { return 0; }
void foo(int* x) { *x = 1; }
...
foo(&f());
如果要使用unique_ptr
管理生命周期,请让函数先创建对象,然后将其所有权移交给unique_ptr
:
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);
...
}
如果我理解正确,我正在传递存储0x123456的变量的地址?
是的,您理解正确。 您正在传递包含另一个地址的变量的地址。
为什么功能需要它?
在大多数情况下,当传递给该函数的参数通常是设计使然的指针,并且该函数需要修改参数本身(在您的示例中,包含0x123456
的变量)时,函数会将指针声明为参数的指针。
如何将其传递给av_hwdevice_ctx_create? 因为我做错事
你不应该 此函数使调用方有责任在使用后释放内存,但是,如果您确实想这样做,则可以使用unique_ptr.get()
分配一个变量,然后传递此新变量的地址(这将破坏整个思路)您正在使用的智能指针-在这种情况下,您应该使用原始指针)。
如您所写,将指针传递给某物时,该函数可以修改指针所指向的对象/内存中的数据。 但是您(即您的应用程序)必须自己分配内存。
当您传递指针的地址时,被调用的函数可以分配内存本身,并通过指针返回新分配的对象或内存。
顺便说一句:如果您的应用程序必须再次释放内存,请阅读文档!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.