c ++内存管理伙伴系统奇怪的内存地址问题

时间:2014-04-27 05:41:39

标签: memory c++11

我正在尝试使用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。

1 个答案:

答案 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)