【问题标题】:new operator in function parameter函数参数中的新运算符
【发布时间】:2012-08-04 23:21:46
【问题描述】:

我有一个函数,该函数接受一个类指针。问题是我这样调用类指针。

Function (new ChildClass);

函数看起来像这样

void Function (BaseClass *instance)
{
    childClassInstance = instance;
}

我之所以用 new 关键字调用它是因为我需要在我的函数之外使用它。我想知道的是。当我准备好删除实例时。我该怎么办?由于它在函数参数中,我将如何调用它以删除它?或者我如何能够访问它在内存中的位置以便能够删除它?

如果这是不可能的,什么是更好的解决方案?

【问题讨论】:

    标签: c++ class operator-keyword base


    【解决方案1】:

    这是可能的,但也有更好的解决方案。 使用 RAII。 或者通过引用传递参数:

    void Function (BaseClass& instance);
    //...
    ChildClass c;
    Function(c);
    

    即使你确实保留了一个指针,你也不必使用new 创建一个新实例来传递一个指针作为参数:

    ChildClass c;
    Function(&c);
    

    【讨论】:

    • 问题是我在另一个函数中调用了这个函数。所以例如我有。 void OtherFunction() { ChildClass c; Function(&c) } 但是在 otherfunction 过期之后就没有什么可指的了
    • @user1583115 如果你需要在OtherFunction() 退出后拥有对象,为什么要在里面声明它而不是作为参数传递呢?
    • 哦,我发现了我的问题。这是个好问题。我想我需要重新排列我的代码。
    【解决方案2】:

    您可以在调用函数之前声明一个变量来存储指针。然后你可以在你的函数返回后删除它。

    ChildClass *c = new ChildClass;
    Function(c);
    delete c;
    

    但是,如果这是您的习惯用法,那么只需使用自动实例即可。然后,当它超出范围时,您的对象会被自动删除。

    ChildClass c;
    Function(&c);
    

    【讨论】:

    • 请对不赞成票发表评论,以便我改进我的答案。谢谢!
    【解决方案3】:

    如果您使用 new 创建一个对象,那么您必须将该指针保存在某处,以便以后删除它。没有其他选择。但这是使指针变得棘手的原因之一,因此您应该尽可能避免使用它们。您可以像其他人所说的那样避免使用 new,或者您可以使用 智能指针,它会自动为您删除对象。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 2019-07-19
      • 1970-01-01
      • 2021-06-23
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多