我应该删除作为参数传递给函数的指针吗?

Arn*_*rah 5 c++ pointers new-operator delete-operator

所以,我在读有关删除指针参数一些堆栈溢出的答案特别是这些的(1,2),因为我建立一个功能,需要一个指针作为参数.

该功能的简化版本如下:

void draw(Shape * b)
{
    //Draws code....
}
Run Code Online (Sandbox Code Playgroud)

不,我在这里感到困惑的是删除.例如,如果函数被调用如下:

Shape * c;
draw(&c);
Run Code Online (Sandbox Code Playgroud)

然后我不必删除任何东西.但如果它是这样的:

draw(new Shape{});
Run Code Online (Sandbox Code Playgroud)

然后我必须.所以基本上,我的问题是,如果在new参数中使用关键字,我应该如何删除.没有可能在函数中抛出的异常,因此不需要RAII.有任何想法吗?请不要提出任何涉及智能指针的内容,因为这是我已经做过的,这个问题就是好奇心.另外,请回答知道函数可以同时使用新运算符或现有指针,这基本上意味着我需要一种方法来区分两者.另外,对于我的链接:这些并没有真正回答我的问题,因为它们中的大多数只依赖于智能指针,或者一个呼叫或另一个.

Ric*_*ges 8

现在我对此感到困惑的是删除.

这正是我们永远不会将原始指针作为参数传递的原因.

以下是您可能需要考虑的一些经验法则:

  1. 你可能不会改变我传给你的形状:

    void draw(const Shape& shape);

  2. 你可以改变形状,但我保留它的所有权:

    void draw(Shape& shape);

  3. 请使用我的形状副本:

    void draw(Shape shape);

  4. 请取消我对这种形状的所有权:

    void draw(std::unique_ptr<Shape> shape);

  5. 让我们分享这个形状:

    void draw(std::shared_ptr<const Shape> shape);


Jar*_*d42 5

你可能会用

void draw(std::observer_ptr<Shape> shape)
Run Code Online (Sandbox Code Playgroud)

要么

void draw(Shape& shape)
Run Code Online (Sandbox Code Playgroud)

过度

void draw(Shape * shape)
Run Code Online (Sandbox Code Playgroud)

明确表示draw不回收所有权.

当你收回它时,在签名中使用智能指针.

void Take(std::unique_ptr<Shape> shape);
Run Code Online (Sandbox Code Playgroud)

要么

void Take(std::shared_ptr<Shape> shape);
Run Code Online (Sandbox Code Playgroud)