c++ - C++ - 创建非局部变量指针的最佳方法
问题描述
我最近在使用 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++ 最佳实践,但有一个我真的想要澄清一个特定领域。
我ControlNode
在getControlNodes()
方法的for loop
. 我现在知道这样做很糟糕,因为我正在存储一个指向局部变量的指针,然后每次循环迭代都会超出范围。我更喜欢存储指针而不是实际的控制节点(尽管我可能会相信,否则,因为控制节点拥有一个位置 [2 个浮点数]、一个材质 [1 个整数],以及其他两个同时具有位置和材质的对象他们自己的。)
创建非局部变量指针的最佳方法是什么?我知道我可以只使用“ new ControlNode()
”,但据我所知,这最终会是一个相当昂贵的调用,并且需要清理(这也可能很昂贵)。我将相当频繁地调用这部分代码,所以我希望它高效。
谢谢!
解决方案
使用控制节点向量进行存储。每当您需要一个新的控制节点时,请在该向量上附加一个。不要使用指针,而是使用指向该向量的迭代器。确保您预先在该向量中保留了足够的插槽,否则您的迭代器将失效。
推荐阅读
- eclipse - 超级开发模式下的客户端 GWT 调试
- c# - LUIS 获取所有意图列表,其中包含所有标记的话语
- activeadmin - 从 has_many 关系中创建新值并选择现有值
- python - 嵌套列表和 count() - 后续问题
- swift - 二进制搜索实现中的 Swift 可选参数
- javascript - Socket.io 与 url 的基本网络套接字连接?
- postgresql - Postgres PGSimpleDataSource 更改数据库名称
- logback - 在 SiftingAppender 中使用 RollingFileAppender 时不起作用
- python - How to parse json into panda dataframe
- java - 使用 Glide 加载 url 的数组列表