【问题标题】:What's the point of passing address of pointer to function that needs pointer to pointer?将指针的地址传递给需要指针的函数有什么意义?
【发布时间】:2019-08-16 06:04:37
【问题描述】:

我正在阅读example of ffmpeg decoding,它具有传递给函数的指针地址:

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

【问题讨论】:

  • 阅读参数文档:ffmpeg.org/doxygen/3.2/…
  • 还要注意,你需要调用一个特殊的函数来销毁它,所以你正常的 unique_ptr 将不起作用。
  • 上下文创建函数希望在调用函数中分配一个指向AVBufferRef * 的指针,因此需要传递一个指向该指针的指针才能进行更改。跨度>
  • @user202729 谢谢,我使用的是自定义删除器,只是示例中没有添加

标签: c++ ffmpeg


【解决方案1】:

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

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

unique_ptr 的引用不起作用的原因是因为你试图获得一个临时的引用,它会立即死亡。如果函数接受一个 const ref 它会起作用,但显然这不是你想要实现的。

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

【讨论】:

    【解决方案2】:

    出于同样的原因,想要修改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);
        ...
    }
    

    【讨论】:

      【解决方案3】:

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

      当你传递一个指针的地址时,被调用的函数可以自己分配内存,并通过指针返回新分配的对象或内存。
      顺便说一句:如果您的应用程序必须再次释放内存,请阅读文档!

      【讨论】:

      • 谢谢,我知道我需要释放分配的内存,我正在使用自定义的 unique_ptr 删除器,我只是没有在示例中添加。但是你知道当指针在 unique_ptr 中时如何传递对指针的引用吗?正如您在我的问题中看到的那样,我做不到&amp;myUniquePtr.get()
      • @GuerlandoOCs 您可以在新变量中分配 myUniquePtr.get() 的返回值,然后将这个新变量的地址传递给函数。但是我认为在这种情况下使用原始指针更有意义。
      • 是的,首先使用一个原始指针,并且只有当你得到指针时,才将它分配给std::unique_ptr()以确保它被删除。
      【解决方案4】:

      如果我理解正确,我传递的是存储 0x123456 的变量的地址?

      是的,你没看错。您正在传递包含另一个地址的变量的地址。

      为什么函数需要它?

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

      如何将它传递给 av_hwdevice_ctx_create?因为我这样做时会出错

      你不应该。这个函数让调用者有责任在使用后释放内存,但是如果你真的想这样做,你可以用unique_ptr.get()分配一个变量,然后传递这个新变量的地址(这将打破整个想法您正在使用的智能指针 - 在这种特殊情况下,您应该使用原始指针)。

      【讨论】:

        猜你喜欢
        • 2020-01-09
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        相关资源
        最近更新 更多