我正在尝试使用c ++实现伙伴内存系统,但我遇到了一些问题。我将一个内存地址分配给一个数组中的元素,并且存储在main中的内存地址与该函数返回的内存地址不同。我相信存储地址时会出错,将其重置为“有效”位置,但我不确定哪一个是“正确”的地址。代码和输入发布在下面。
void buddy_manager(memoryNode* root, process* processes, int num){
int i = 0, count = 0, removed = 0, j = 0;
process running[num];
while(removed < 5){
if(i % 50 == 0 && count<5){
cout << "Adding process: " << count << endl;
running[count] = processes[count];
running[count].space = my_malloc(root, running[count].memory * 1000);
printf("Made new node @ %p \n", running[count].space);
count++;
}
//Check to remove the process from the list omitted
}
char* my_malloc (memoryNode* root, int size) {
//If there are child nodes and the current node is not occupied, visit them!
if(root->left != NULL && root->right != NULL && root->occupied == 0){
if(my_malloc(root->left, size) == NULL){
my_malloc(root->right, size);
}
} else{ //we are at a leaf node
if(root->max_size >= size && root->max_size/2 < size && root->left == NULL && root->right == NULL && root->occupied == 0){ //if the node is good for insertion{
printf("address of new node: %p with slize: %d and element size: %d \n", root->start, root->max_size, size);
root->occupied = 1;
return root->start;
} else if(!(root->max_size > size && root->max_size/2 < size) && root->max_size > 0 && root->occupied == 0 && root->left == NULL && root->right == NULL) { //Grow the tree
root->left = new memoryNode(root->start, root->max_size/2, NULL, NULL, 0);
root->right = new memoryNode((char*)(root->start + (root->max_size)/2), root->max_size/2, NULL, NULL, 0);
//printf("Made new nodes at %p and %p \n", root->left->start, root->right->start);
my_malloc(root->left, size);
} else{
return NULL;
}
}
}
我的输出如下:
address of new node: 0xb6d86008 with size: 156250 and element size: 94000
Made new node @ 0xb6d86008
Adding process: 1
address of new node: 0xb6dd24bc with size: 312500 and element size: 193000
Made new node @ 0xb6dd2400
Adding process: 2
address of new node: 0xb6e1e970 with size: 156250 and element size: 106000
Made new node @ 0xb6e1e900
Adding process: 3
address of new node: 0xb6dc8c25 with size: 39062 and element size: 26000
Made new node @ 0xb6dc8c00
Adding process: 4
address of new node: 0xb6e44bca with size: 19531 and element size: 18000
Made new node @ 0xb6e44b00
你可以看到,第一个节点没问题,但其余的节点最后都会因为最后两位数而重置为00。
答案 0 :(得分:1)
一个疯狂的猜测,如果你使用的是32位系统:
process
结构的大小不是4个字节的倍数。因此,space
数组的第二个元素中的process running[num]
字段未正确对齐到4字节地址。
在此结构的末尾添加4-sizeof(process)%4
个字节可以解决问题。
一个疯狂的猜测,如果您使用的是64位系统:
process
结构的大小不是8个字节的倍数。因此,space
数组的第二个元素中的process running[num]
字段未正确对齐到8字节地址。
在此结构的末尾添加8-sizeof(process)%8
个字节可以解决问题。
<强>更新强>
如果您已确认上述问题不是问题背后的原因,请在从功能root->start
返回之前打印my_malloc
,并确保始终对齐到4(或8)个字节。
我还注意到函数my_malloc
在所有情况下都没有返回值,这可能导致未定义的行为(我不明白你是如何设法编译它而没有错误开始的)。
因此,在此功能中,在return
之前添加my_malloc(root->left, size)
。