我今天遇到了关于新分配对象的内存位置的问题。我有一个像这样的循环:
for (int x = 0; x < n; x++) {
GraphNode new_node;
nodes[x] = &new_node;
}
我发现node []数组的每个元素都接收到相同的地址指针,但我认为我在每次迭代中实例化一个新实例,因此n个对象将具有不同的地址。我能够使用以下代码解决问题,导致n个对象具有不同的地址,填充我的数组节点[]:
for (int x = 0; x < n; x++) {
GraphNode* new_node = new GraphNode();
nodes[x] = new_node;
}
这些实例化技术的不同之处是什么?另外,对我来说,第一个片段会有这种行为似乎很奇怪。
答案 0 :(得分:2)
在第一个示例中,您创建的GraphNode(然后打印地址)在for循环结束时超出范围并被收回。当你创建下一个 - 在循环的顶部 - 用于最后一个的内存再次可用,因此用于序列中的下一个GraphNode。
在第二个示例中,通过调用new,您明确要求系统为该对象保留存储空间。因为你自己分配了它,所以在你自己删除之前,GraphNode永远不会被释放。由于它们尚未被释放,因此当在循环顶部分配下一个GraphNode时,它们的地址空间不可用,并且每个GraphNode都获得它自己的存储空间。
要查看此操作的一些事情:在GraphNode的构造函数和析构函数中打印出一些内容。