Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个动态对象创建在正确性或良好的代码结构方面是什么样子的?_C++_C++14_New Operator_Dynamic Memory Allocation - Fatal编程技术网

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

这是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);
     }
}

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);