就正确性或良好的代码结构而言,这种动态对象创建看起来如何?

How does this dynamic object creation look like in terms of correctness or good code structure?

这是A*算法的部分代码。我想知道这是否好,或者我最好在这里使用静态内存分配(我认为那会更好)。但不太确定是 C++ 的新手。另外,我正在为算法使用网格,所以我该如何删除它。请指导。欢迎任何建议。谢谢

for (int i = 0; i<world.size()-1 ; i++)
{
     for(int j =0; j<world[0].size()-1; j++)
     {           
         Node* a = new Node(make_pair(i,j), world[i][j]);
         grid[i].push_back(*a);
     }
}

当您将 Node 而不是 Node* 推入 grid 向量时,您正在复制 *a 的值(通过 copy/move 构造函数)。因此分配的Node只会用于复制,以后永远不会使用。

你应该要么使用局部变量,然后你不关心你身边的任何删除

Node a = Node(make_pair(i,j), world[i][j]);
grid[i].push_back(a);

或者您可以使网格成为指针向量 (vector<Node*>) 并推送 a 本身。然后你必须像创建它们一样手动删除 vector 中的所有指针。

Node* a = new Node(make_pair(i,j), world[i][j]);
grid[i].push_back(a);

第一种情况可以用 emplace 函数做得更好,避免复制 - 在向量数组中构造 Node:

grid[i].emplace_back(make_pair(i,j), world[i][j]);

在第二种情况下,您可以使用一些智能指针,例如std::unique_ptr (vector>),这样您就不必手动删除指针。 unique_pointer 的析构函数将处理它。

grid[i].push_back(make_unique<Node>(make_pair(i,j), world[i][j]));

一个技巧是存储地址而不是对象。地图将是管理节点的有用对象。