Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';将指针的地址传递给需要指针的函数的点是什么?_C++_Ffmpeg - Fatal编程技术网

C++ 什么';将指针的地址传递给需要指针的函数的点是什么?

C++ 什么';将指针的地址传递给需要指针的函数的点是什么?,c++,ffmpeg,C++,Ffmpeg,我正在读取一个,它有一个指针的地址被传递到一个函数: static AVBufferRef *hw_device_ctx = NULL; if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type, NULL, NULL, 0)) < 0) { 如何将其传递给av\HWU设备\U ctx\U create?因为当我这样做的时候,我会出错 av_hwdevice

我正在读取一个,它有一个指针的地址被传递到一个函数:

static AVBufferRef *hw_device_ctx = NULL;


if ((err = av_hwdevice_ctx_create(&hw_device_ctx, type,
                                  NULL, NULL, 0)) < 0) {
如何将其传递给av\HWU设备\U ctx\U create?因为当我这样做的时候,我会出错

av_hwdevice_ctx_create(&hw_pointer.get(),...
它说:

expression must be an lvalue or a function designator
如果我理解正确,我正在传递存储0x123456的变量的地址

是的,你理解得对。您正在传递包含另一个地址的变量的地址

为什么函数需要它

在大多数情况下,当传递给该函数的参数通常是设计上的指针,并且函数需要修改参数本身时,函数会将指向指针的指针声明为参数(在您的示例中,包含
0x123456
的变量)

如何将其传递给av_设备_ctx_创建?因为当我这样做的时候,我会出错

av_hwdevice_ctx_create(&hw_pointer.get(),...

你不应该。此函数允许调用方负责在使用后释放内存,但是如果确实想这样做,可以使用
unique\u ptr.get()
分配一个变量,然后传递此新变量的地址(这将打破您正在使用的智能指针的整个概念-在这种情况下,您应该使用原始指针)。

如您所写,当您将指针传递到某个对象时,函数可以修改指针指向的对象/内存中的数据。但是您,即您的应用程序,必须分配内存本身

当您传递指针的地址时,被调用的函数可以分配内存本身,并通过指针返回新分配的对象或内存。

顺便说一句:如果应用程序必须再次释放内存,请阅读文档!

传递指针时,按值传递指针。因此,可以修改指针指向的变量,但不能修改指针本身

如果需要修改指针本身(例如指向其他地方),可以通过引用或指针指向指针来传递它

unique_ptr的引用不起作用的原因是,您试图获取一个临时的引用,该引用将立即消失。如果函数接受const ref,它将起作用,但显然这不是您想要实现的


您不应该修改由智能指针管理的指针。您可以在函数调用后将指针传递给智能指针。

它需要这样做,原因与要修改
int
的函数需要传递指向可修改
int
的指针(或引用)的原因相同

就是你的情况跟

int f() { return 0; }
void foo(int* x) { *x = 1; }
...
foo(&f());
如果要使用
唯一\u ptr
管理生命周期,请让函数先创建对象,然后将其所有权移交给
唯一\u 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);
    ...
}
AVBufferRef*hw_device_ctx=NULL;
如果((err=av_-hwu-device_-ctx_-create(&hw-u-device_-ctx),则键入,
NULL,NULL,0))<0){
..
}
其他的
{
std::唯一的硬件指针(硬件设备ctx);
...
}

阅读参数文档:还请注意,您需要调用一个特殊函数来销毁它,因此您的普通unique\u ptr无法工作。context create函数希望为调用函数中的
AVBufferRef*
分配一个指针,因此需要向它传递一个指向该指针的指针才能进行更改。Related:@user202729谢谢,我使用的是自定义删除器,我只是没有在示例中添加。谢谢,我知道我需要释放已分配的内存,我使用的是自定义唯一的\u ptr删除器,我只是没有在示例中添加。但是你知道当指针位于唯一的\u ptr中时如何将引用传递给指针吗?正如你在我的问题中看到的,我不能do
&myUniquePtr.get()
@GuerlandoOCs您可以分配myUniquePtr.get()的返回在一个新变量中,然后将这个新变量的地址传递给函数。但是我认为在这种情况下使用原始指针更有意义。是的,首先使用原始指针,并且只有当你得到指针时,才将其分配给
std::unique\u ptr()
,以确保它被删除。