在 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_ptr
或 shared_ptr
而不是原始指针。 (原始指针是我在前面的示例中所做的。)这些工作更像 C++ 对象,当您丢失所有指针时,它会知道并为您删除内存。这称为 RAII(资源获取即初始化),强烈建议您学习它。
我正在努力学习最佳实践,同时提高我的 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_ptr
或 shared_ptr
而不是原始指针。 (原始指针是我在前面的示例中所做的。)这些工作更像 C++ 对象,当您丢失所有指针时,它会知道并为您删除内存。这称为 RAII(资源获取即初始化),强烈建议您学习它。