就正确性或良好的代码结构而言,这种动态对象创建看起来如何?
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]));
一个技巧是存储地址而不是对象。地图将是管理节点的有用对象。
这是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]));
一个技巧是存储地址而不是对象。地图将是管理节点的有用对象。