C++ 这个动态对象创建在正确性或良好的代码结构方面是什么样子的?
这是a*算法代码的一部分。我想知道这是否好,或者我最好在这里使用静态内存分配(我认为这样会更好)。但是对于C++来说,并不是很确定。另外,我在算法中使用了网格,所以我如何删除它。请导游。欢迎任何建议。谢谢C++ 这个动态对象创建在正确性或良好的代码结构方面是什么样子的?,c++,c++14,new-operator,dynamic-memory-allocation,C++,C++14,New Operator,Dynamic Memory Allocation,这是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_pai
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);
}
}
for(int i=0;i当您将节点
而不是节点*
推送到网格
向量时,您正在复制*a
的值(通过复制/移动构造函数)。因此,分配的节点
将仅用于复制,而不会使用
您应该要么使用局部变量,然后您就不关心从您这边删除任何内容
Node a = Node(make_pair(i,j), world[i][j]);
grid[i].push_back(a);
或者,您可以将网格作为指针的向量(vector
),并推动a
本身。然后您必须以创建向量的相同方式手动删除向量中的所有指针
Node* a = new Node(make_pair(i,j), world[i][j]);
grid[i].push_back(a);
第一种情况可以使用emplace
功能进行改进,避免复制-在向量数组中构造节点
:
grid[i].emplace_back(make_pair(i,j), world[i][j]);
在第二种情况下,您可以使用一些智能指针,例如std::unique_ptr(vector>),这样您就不必手动删除指针。unique_指针的析构函数将处理它
grid[i].push_back(make_unique<Node>(make_pair(i,j), world[i][j]));
grid[i]。向后推_(使_唯一(使_对(i,j),world[i][j]);
一个提示是存储地址而不是对象。映射是一个有用的对象来管理你的节点。
内存泄漏Galor。考虑到每当你明确使用<代码>新< /代码>时,你的代码可能有问题。如果你要复制它的值并扔掉它,就没有使用动态分配的一点。ter.这可能更适合于,但这绝对是离题的。是的,我现在意识到,当不确定堆的大小或要向堆中添加更多内容时,动态分配是有用的。因此,我应该使用:节点a(make_pair(I,j),world[I][j]);网格[I]。推回(a);