在 C++ 中初始化指向结构的指针的正确方法是什么?

What is the correct way to initialise pointers to structs in C++?

我正在努力学习最佳实践,同时提高我的 C++ 技能,但我有一个问题。

如果我有,例如这个,结构:

struct Vector {
    int x;
    int y;
};

typedef struct {
    Vector position;
    Vector velocity;
} Ball;

哪一个是正确的初始化方法?

Ball* _ball1 = new Ball();
Ball* _ball2 = new Ball;

我知道在这种情况下创建一个 class 会更好,但我正在尝试使用各种结构等

此外,关于结构定义 - 而不是 typedef struct {} Ball;,是否更好:struct Ball{}; ?

如有任何见解,我们将不胜感激。

谢谢!

编辑:谢谢大家的回答!

首先,您可以这样做:

Ball ball;

您现在有一个本地 Ball 对象。它将持续到关闭封闭代码为止。即:

cout << "Foo\n";
if (true) {
    Ball ball;
}
cout << "Bar\n";

球只存在于那些{}里面。如果你试图在外面(找到 Bar 的 cout 的地方)使用它,它不会在那里。所以在很多情况下,你的变量在函数调用的范围内是有效的。

void foo() {
   Ball ball;
   ...
}

这是最简单的方法,它可能适用于您的大多数用例。您可能不需要担心第一段代码的指针。

但是,如果您有理由想要真正使用指针,您可以这样做:

void foo() {
    Ball * ball = new Ball;
    ... make use of it
    delete ball;
}

如果不执行删除操作,就会发生内存泄漏。与 Java 不同,C++ 没有任何类型的垃圾收集器。你一个人。

但你也可以这样做:

void foo() {
    std::shared_ptr<Ball> ball = std::make_shared<Ball>();
    ... use it
    ... no delete required
}

这些被称为智能指针,C++ 的趋势是使用 unique_ptrshared_ptr 而不是原始指针。 (原始指针是我在前面的示例中所做的。)这些工作更像 C++ 对象,当您丢失所有指针时,它会知道并为您删除内存。这称为 RAII(资源获取即初始化),强烈建议您学习它。