【发布时间】:2020-12-30 13:01:22
【问题描述】:
我最近在使用 Unreal 引擎开发游戏时重新学习 C++。接触 C++ 已经快 3 年了,从那时起我主要使用 Java。
由于 java 和 c++ 之间的差异,我已经可以看出对于类似概念有不同的最佳实践。
我有两种这样的方法。
void UMarchingSquares::Generate(std::map<Vector2, int> automata) {
std::map<Vector2,ControlNode*> controlNodes = getControlNodes(automata);
}
std::map<Vector2,ControlNode*> UMarchingSquares::getControlNodes(std::map<Vector2, int> automata) {
std::map<Vector2,ControlNode*> controlNodes = std::map<Vector2, ControlNode*>();
for(pair<Vector2,int> pair : automata) {
Vector2 pos = pair.first;
ControlNode node = ControlNode(pos,pair.second);
controlNodes[pos] = &node;
}
return controlNodes;
}
我可能破坏了一些不同的 C++ 最佳实践,但有一个我真的想要澄清一个特定领域。
我在getControlNodes() 方法的for loop 中初始化ControlNode 对象。我现在知道这样做很糟糕,因为我存储了一个指向局部变量的指针,然后每次循环迭代都会超出范围。我更喜欢存储指针而不是实际的控制节点(尽管我可能会相信,否则,因为控制节点拥有一个位置 [2 个浮点数]、一个材质 [1 个整数],以及其他两个同时具有位置和材质的对象他们自己的。)
创建非局部变量指针的最佳方法是什么?我知道我可以只使用“new ControlNode()”,但据我所知,这最终是一个相当昂贵的调用,并且需要清理(这也可能很昂贵)。
我将相当频繁地调用这部分代码,所以我希望它高效。
谢谢!
【问题讨论】:
-
为什么需要指针?
-
如果您忘记了 Java,您的代码会变得更简单,以至于您的问题可能变得毫无意义(取决于您认为需要指针的原因)。 例如:
std::map<Vector2,ControlNode> controlNodes;不需要过多的初始化语法。 -
假设您坚持使用指针,那么智能指针就是要走的路,
std::unique_ptr<ControlNode>。您可能还想查看移动语义以提高效率。
标签: c++ pointers memory-management memory-leaks