我今天遇到了一个关于新分配对象的内存位置的问题。我有一个这样的循环:
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;
}
这些实例化技术有什么区别?另外,我觉得第一个片段会有这样的行为很奇怪。
在第一个示例中,您创建(然后打印其地址)的 GraphNode 在 for 循环结束时超出范围并被收割。当您创建下一个 - 在循环的顶部 - 用于最后一个的内存再次可用,因此用于序列中的下一个 GraphNode。
在第二个示例中,通过调用 new,您明确要求系统为该对象保留存储空间。因为你自己分配了它,GraphNode 永远不会被释放,除非你自己通过删除来释放。因为它们还没有被释放,所以当下一个 GraphNode 在循环的顶部分配时,它们的地址空间不是空闲的,并且每个人都有自己的内存空间。
需要做的事情才能看到这一点:在 GraphNode 的构造函数和析构函数中打印出一些东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句