首页 > 解决方案 > 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++ 最佳实践,但有一个我真的想要澄清一个特定领域。

ControlNodegetControlNodes()方法的for loop. 我现在知道这样做很糟糕,因为我正在存储一个指向局部变量的指针,然后每次循环迭代都会超出范围。我更喜欢存储指针而不是实际的控制节点(尽管我可能会相信,否则,因为控制节点拥有一个位置 [2 个浮点数]、一个材质 [1 个整数],以及其他两个同时具有位置和材质的对象他们自己的。)

创建非局部变量指针的最佳方法是什么?我知道我可以只使用“ new ControlNode()”,但据我所知,这最终会是一个相当昂贵的调用,并且需要清理(这也可能很昂贵)。我将相当频繁地调用这部分代码,所以我希望它高效。

谢谢!

标签: c++pointersmemory-managementmemory-leaks

解决方案


使用控制节点向量进行存储。每当您需要一个新的控制节点时,请在该向量上附加一个。不要使用指针,而是使用指向该向量的迭代器。确保您预先在该向量中保留了足够的插槽,否则您的迭代器将失效。


推荐阅读