0

演算子 new をオーバーロードして最適なアルゴリズムを実装する方法を練習しています。

#include<iostream>
#include<malloc.h>
using namespace std;

#define SUCCESS 0
#define FAILURE -1

#define MAX_PARTITION_SIZE 1000

int *avail_space,*needed_space,*used_space,*done_space,*free_space;
int index,j,k,partitions,nop,flag,total_avail;
int *ptr[10];
int no_obj;

class memory{
        private:

        public:
        void set_data();
        void create_mem();
        int create_partitions();
        int alloc_space();
        int showdata();
        int bestfit_search(int* index);
        void* operator new(size_t size);
        void operator delete(void* p);
};

void* memory :: operator new(size_t size){
        void* p;
        int index_no;
        memory obj;
        int i = 0;
        cout << "In Overloaded new" << endl;
        cout << "Size : - " << size << endl;
        for(i = 0; i < no_obj; i++){
                cout << "address :" << ptr[i] << endl;
        }
        cout << "Size : " << sizeof(memory) << endl;
        needed_space[index] = sizeof(memory);
        obj.bestfit_search(&index_no);      // I guess the problem is in this function where I need to call a non-static member function.
        cout << "Index_no - " << index_no << endl;
        return ptr[index_no];
}

void memory :: operator delete(void* p){
        cout << "In Overloaded delete" << endl;
        free(p);
}

void memory :: set_data(){
        total_avail = MAX_PARTITION_SIZE;
        index = partitions = nop = flag = j = k = 0;
}

void memory :: create_mem(){
        memory* obj[10];
        int index;
        cout << "Enter the no of objects : " << endl;
        cin >> no_obj;
        for(index = 0; index < no_obj; index++){
                cout << "Creating obj : - " << index << endl;
                obj[index] = new memory();
        }
}

/* Allocate memory to all the pointer variables based on the no of partitions */
int memory :: alloc_space(){
        avail_space = new int[partitions];
        needed_space = new int[partitions];
        used_space = new int[partitions];
        done_space = new int[partitions];
        free_space = new int[partitions];
        if((NULL == avail_space) || (NULL == needed_space) || (NULL == used_space) || (NULL == done_space) || (NULL == free_space)){
                return FAILURE;
        }
        return SUCCESS;
}
/* Get the no of partitions and the space needed for each of the partition */
int memory :: create_partitions(){
        cout << "Enter the No of partitions to be created : " << endl;
        cin >> partitions;
        cout << endl;

        /* allocate the space for the pointers */
        if(FAILURE == alloc_space()){
                return FAILURE;
        }

        /* Get the size of each partition and update the freespace*/
        cout << "Enter the space for each of the partitions : " << endl;
        for(index = 0; index < partitions; index++){
                cout << "Partition : " << index << "\t";
                cin >> avail_space[index];
                free_space[index] = avail_space[index];
                ptr[index] =(int*)malloc(avail_space[index]);
                if(ptr[index] == NULL){
                        cout << "Memory allocation failed!" << endl;
                        return FAILURE;
                }
                cout << "ptr : [" << index << "] - " << ptr[index] << endl;
        }
        cout << endl;
        return SUCCESS;
}

/* Display the available, used and free space*/
int memory :: showdata(){
        cout << "Available space  "<< "Used space  "<<"Free space  " <<"Done space "<<endl;
        for(index = 0; index < partitions; index++){
                cout << avail_space[index]<<"\t\t"<<used_space[index]<<"\t\t"<<free_space[index]<<"\t\t"<<done_space[index]<<endl;
        }
        return SUCCESS;
}

/* Algorithm to search for the best fit memory */
int memory :: bestfit_search(int* index_no){
        if(NULL == index_no){
                cout << "Invalid parameter!" << endl;
                return FAILURE;
        }
        int space = 0;
        for(index = 0; index < nop; index++){
                space = needed_space[index];
                flag = 0;
                for(k = space; k < MAX_PARTITION_SIZE; k++){    // MAX_PARTITION_SIZE - 1000
                        for(j = 0; j < partitions; j++){
                                if((space == avail_space[j]) && (done_space[j] != 1) && (flag != 1)){
                                        used_space[j] = needed_space[index];
                                        free_space[j] = avail_space[j] - needed_space[index];
                                        done_space[j] = 1;
                                        cout << "Used space" <<used_space[j] << " freespace" << free_space[index] <<"done space " << done_space[index] <<endl;
                                        flag = 1;
                                        *index_no = j;
                                        break;
                                }
                        }
                        if(flag == 1){
                                break;
                        }
                        space++;
                }
        }
        showdata();
        return SUCCESS;
}

/* Main */
int main(){
        memory obj;
        obj.set_data();
        obj.create_partitions();
        obj.create_mem();
        return SUCCESS;
}

プログラムの実行:

Enter the No of partitions to be created : 
5

Enter the space for each of the partitions : 
Partition : 0   2
ptr : [0] - 0x9e62080
Partition : 1   7
ptr : [1] - 0x9e62090
Partition : 2   3
ptr : [2] - 0x9e620a0
Partition : 3   10
ptr : [3] - 0x9e620b0
Partition : 4   25
ptr : [4] - 0x9e620c0

Enter the no of objects : 
2
Creating obj :
In Overloaded new
Size :  1
address :0x9e62080
address :0x9e62090
Size : 1
Available space  Used space  Free space  Done space 
2       0       2       0
7       0       7       0
3       0       3       0
10      0       10      0
25      0       25      0
Index_no - 0

Creating obj :
In Overloaded new
Size : 1
address :0x9e62080
address :0x9e62090
Size : 1
Available space  Used space  Free space  Done space 
2       0       2       0
7       0       7       0
3       0       3       0
10      0       10      0
25      0       25      0
Index_no - 1

使用可能なスペース 2 と 3 を使用済みスペース 1 で占有する必要があるため、間違った出力が得られます。

4

0 に答える 0