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()
,以确保它被删除。