【问题标题】:Can I modify the target of a pointer passed as parameter?我可以修改作为参数传递的指针的目标吗?
【发布时间】:2013-04-22 23:21:45
【问题描述】:

函数能否更改作为参数传递的指针的目标,以使效果保持在函数之外?

void load(type *parameter)
{
    delete parameter;
    parameter = new type("second");
}

type *pointer = new type("first");
load(pointer);

在这个最小的例子中,pointer 会指向第二个分配对象吗?如果没有,我怎么能得到这种行为?

更新:为了澄清我的意图,如果参数是普通类型而不是指针,我将使用以下代码。在这种情况下,我会简单地使用引用。

void load(type &parameter)
{
    parameter = type("second");
}

type variable("first");
load(&variable);

这很简单,但我尝试用指针做同样的事情。

【问题讨论】:

    标签: c++ function pointers reference scope


    【解决方案1】:

    没有。

    parameter 在这种情况下将获得pointer 值的副本。所以它是一个新变量。您对其所做的任何更改仅在函数范围内可见。 pointer 保持不变。

    你必须通过引用传递the pointer

    void load(type *& parameter)
                    ^
    {
    

    【讨论】:

    • 我不知道这个概念。它按预期工作。谢谢。
    • @danijar 很高兴我能帮上忙。
    • 只有delete parameter; 部分不起作用。我导致访问冲突。我可以在分配新对象之前以某种方式释放内存吗?
    • 忘记我说过的话。我只是通过两个嵌套函数传递了指针引用,尽管我可以在第一个函数中删除并传递给第二个函数。换句话说,我试图传递一个死指针。但如果我只在新分配之前删除,一切正常。
    • @danijar Ya只记得在删除后将其设置为NULL。这样您就可以多次安全删除。
    【解决方案2】:

    需要通过引用传递指针:

    void load(type *&parameter);
    

    参见例如http://www.cprogramming.com/tutorial/references.html

    【讨论】:

      【解决方案3】:

      或者,您可以使用double 指针。

      void load(type** parameter)
      {
          delete *parameter;
          *parameter = new type("second");
      }
      
      type *pointer = new type("first");
      load(&pointer);
      

      但是由于您使用的是 cpp,您可以使用 references

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        相关资源
        最近更新 更多