在c++的指针数组中,内存过度提交会导致指针被存储在不连续的内存块中
In an array of pointers in C++ does memory overcommitting result in the pointers to be stored in non-contiguous blocks of memory?
我在XCode中编写一些代码,当我部分填充数组时注意到一些有趣的事情。我的代码基本上是这样的(这只是一个简单的例子):
#include <iostream>
using namespace std;
int main(){
int** array = new int*[20];
for(int k = 0; k < 20; k+=3){
array[k] = &k;
}
for(int k = 0; k < 20; k++){
bool ptrVal = (array[k] == nullptr);
cout << k << ": " << ptrVal << endl;
}
}
这段代码最终输出如下:
0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 1
8: 1
9: 0
10: 1
11: 1
12: 0
13: 1
14: 1
15: 0
16: 1
17: 1
18: 0
19: 1
0: 0
1: 1
2: 1
3: 0
4: 1
5: 1
6: 0
7: 1
8: 1
9: 0
10: 1
11: 1
12: 0
13: 1
14: 1
15: 0
16: 1
17: 1
18: 0
19: 1
之后我读了下面一篇关于操作系统如何过度使用内存的文章:指针数组
的c++内存分配操作系统是否故意为已部分填充的指针数组分配不连续的内存块?如果是这样,它为什么会这样做?我的示例代码中显示的结果可能是什么原因?
你有:
int** array = new int*[20];
for(int k = 0; k < 20; k+=3){
array[k] = &k;
}
之后,k[1], k[2], [k4], k[5] ..
不初始化。它们不是由分配指针的那一行设置为nullptr
的。
因此,
bool ptrVal = (array[k] == nullptr);
是未定义行为的原因。
你可以使用以下命令使指针在分配时等于nullptr
:
int** array = new int*[20]{};
假设数组中未初始化的元素被设置为0。事实并非如此。如果加上
memset(array, 0, sizeof(*array)*20);
在第一个循环之前,那么你的输出将是你所期望的。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- CUDA:统一内存和指针地址的更改
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 将统一的内存指针传递给内核会减慢程序的速度
- malloc - 运行时内存指针类型分配
- 共享内存指针分段错误
- 使用动态分配的内存(指针)
- 与对象一起返回时清除了内存指针
- 在UWP C++项目中,程序集分配的内存指针自动更改为0xffffffff
- 使用注入的 dll 使用内存指针编辑值
- 提升共享内存 - 指针的返回向量
- 监视从应用程序写入指定的内存指针从 DLL 接收
- 非分页内存指针
- Qt读取内存指针值
- 简单的程序帮助-发送动态内存指针到函数