C++如何将指向临时对象(在堆上)的指针传递给函数?

jan*_*048 1 c++ argument-passing

我有一个函数,它接受一个指向自定义类对象的指针(实际指向一个基类,这样多态就起作用).然而,在调用例程中,该对象仅用于该调用的目的,即是临时的.例如这样:

class A { /** stuff */ };
class B : public A { /** stuff */ };

void doSomething( const A* const _p ) { /** stuff */ }

void callingRoutine()
{
  A* tempPointer = new B;
  doSomething( tempPointer );
  delete tempPointer;
}
Run Code Online (Sandbox Code Playgroud)

现在,因为我真的只需要类型的对象B的通话中doSomething,有没有办法做到这一点的一条线?干

doSomething( new B );
Run Code Online (Sandbox Code Playgroud)

造成内存泄漏(valgrind如此说).或者会

doSomething( &B );
Run Code Online (Sandbox Code Playgroud)

是推荐的方式?后者编译但会发出有关将指针传递给临时对象的警告.这就是我想要的,但这样安全吗?

Jam*_*nze 5

如果您可以更改被调用函数的签名,请将其更改为:

void doSomething( A const& obj );
Run Code Online (Sandbox Code Playgroud)

然后你可以用:

doSomething( B() );
Run Code Online (Sandbox Code Playgroud)

如果你不能,应该声明一个局部变量:

void callingRoutine()
{
    B temp;
    doSomething( &temp );
}
Run Code Online (Sandbox Code Playgroud)

如果调用函数较长,并且如果没有立即销毁temp,则会出现问题,您可以将其附加在其他函数中{...}:

void callingRoutine()
{
    {
        B temp;
        doSomething( &temp );
    }
    //  More code here...
}
Run Code Online (Sandbox Code Playgroud)

但是,一般来说,如果有必要,您的功能可能太长.