c++ - 链表地址不定期
问题描述
我试图弄清楚 newNode 地址如何改变 appendNode 的每次迭代。当我将地址从十六进制转换为十进制时,我得到的值是 14683824、14683848、14685096。虽然前两个地址似乎增加了 24,但第三个地址增加了 1248。我不知道为什么会发生这种情况。
//Main Program
#include <iostream>
#include "numberList.h"
using namespace std;
int main()
{
numberList list;
list.appendNode(2.5);
list.appendNode(3.4);
list.appendNode(5.6);
// list.displayList();
return 0;
}
//append.cpp
#include <iostream>
#include "numberList.h"
using namespace std;
void numberList ::appendNode(double num)
{
listNode *newNode;
listNode *nodePtr;
newNode = new listNode;
newNode->value = num;
newNode->next = nullptr;
cout << newNode << endl; //The addresses of the newNode dont have even
intervals
if(!head)
{
head = newNode;
}
else
{
nodePtr = head;
while(nodePtr->next)
{
nodePtr = nodePtr->next;
}
}
}
//numberList.h
#ifndef APPENDNODE_NUMBERLIST_H
#define APPENDNODE_NUMBERLIST_H
class numberList
{
private:
struct listNode
{
double value;
struct listNode *next;
};
listNode *head;
public:
numberList()
{
head = nullptr;
}
//~numberList();
void appendNode(double);
void displayList() const;
void insertNode(double);
void deleteNode(double);
};
#endif //APPENDNODE_NUMBERLIST_H
输出:
0xe00eb0 0xe00ec8 0xe013a8
解决方案
该标准没有为您提供任何关于您分配的内存位置的保证。new
可以为您提供彼此相邻的位置,但也可以完全随机地为您提供位置。你最终得到什么取决于
- 用于分配的算法
new
- 先前分配的模式
那么这次为什么会发生呢?一般而言,连续分配最终接近在一起是有意义的,因为这减少了缓存未命中的机会,但new
没有义务这样做。事实上,因为new
偶尔需要向操作系统请求内存,并且因为new
必须使用一些内存来跟踪分配的内容,所以无法保证所有分配都定期发生。
推荐阅读
- powershell - 尝试测试代码,不断得到“System.____comobject”而不是变量值
- google-apps-script - 如何自动将数据从 blob csv 文件导入工作表
- node.js - Express 和 Node Uncaught ReferenceError: require is not defined
- c - #define VAR {0} 有什么特殊含义吗?
- c - 稳健的增量 CRC32
- excel - VBA excel 图表和表格到 PowerPoint 特定页面
- json - 使用 jenkins 管道显示 Json 文件
- sockets - RST 上的 TCP 重传 - Windows 和 Linux 上的不同套接字行为?
- android-studio - 如果不使用 proguard,在 GP 控制台中获取反混淆文件?
- imagemagick - Imagemagick:使用亮度/叠加蒙版从 3 个图像中创建 1 个图像