Danh mục

LẬP TRÌNH C nâng cao -BÀI 14 - DESTRUCTOR, CONSTRUCTOR, CONVERSION VÀ DEBUG part 2

Số trang: 5      Loại file: pdf      Dung lượng: 204.88 KB      Lượt xem: 12      Lượt tải: 0    
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

BÀI 14: DESTRUCTOR, CONSTRUCTOR, CONVERSION VÀ DEBUG ( tiếp theo)Tương tự bạn có thể viết cho calloc và realloc Phát hiện rò rỉ bộ nhớ với new và delete Với vấn đề phát hiện leak memory, chúng ta nên dùng malloc/free với primitive và dùng new/delete với object, vì delete còn gọi destructor của object. Lí do nữa là overload toán tử new và delete ở global scope rất phức tạp và không phải trình biên dịch nào cũng hỗ trợ overload hai toán tử này. ...
Nội dung trích xuất từ tài liệu:
LẬP TRÌNH C nâng cao -BÀI 14 - DESTRUCTOR, CONSTRUCTOR, CONVERSION VÀ DEBUG part 2 LẬP TRÌNH C/C++ NÂNG CAOYêu cầu trước khi đọc: học xong Lập trình C/C++ căn bản BÀI 14: DESTRUCTOR, CONSTRUCTOR, CONVERSION VÀ DEBUG ( tiếp theo)Tương tự bạn có thể viết cho calloc và reallocPhát hiện rò rỉ bộ nhớ với new và deleteVới vấn đề phát hiện leak memory, chúng ta nên dùng malloc/free vớiprimitive và dùng new/delete với object, vì delete còn gọidestructor của object. Lí do nữa là overload toán tử new và delete ở globalscope rất phức tạp và không phải trình biên dịch nàocũng hỗ trợ overload hai toán tử này. Thêm nữa những ràng buộc chặt chẽvới new/delete khiến đôi khi việc này trở nên khôngthể. Đây là một trong những lí do vì sao malloc/free vẫn còn hữu dụng chodù đã có new/deleteVí dụ sau chúng ta sẽ viết một lớp, overload các toán tử new, delete, new[]và delete[] cho lớp đó. Bạn sẽ thấy là phiên bảnoverload của các toán tử này đã được gọiCODE#include#includeusing namespace std;class MyClass{public:int data;MyClass(){data=0;}MyClass(int data):data(data){}void* operator new(unsigned int size){void* ptr = malloc(size);cout}void operator delete(void* p){coutCòn ví dụ dưới chúng ta sẽ xác định rò rỉ bộ nhớ nếu khởi tạo bằng new màkhông hủy bỏ bằng delete. Với khởi tạo bằng new[] màhủy bỏ bằng delete ta sẽ gọi delete []CODE#include#include#includeusing namespace std;struct MEM_INFO{void* address;int size;char file[256];int line;};list lmi;list::iterator lmii;class MyClass{public:void* operator new(unsigned int size,char* file,int line){void* ptr = malloc(size);if(ptr!=NULL){MEM_INFO memInfo;memset(&memInfo,0,sizeof(MEM_INFO));memInfo.address = ptr;memInfo.size = size;strcpy(memInfo.file,file);memInfo.line = line;lmi.push_back(memInfo);}return ptr;}void operator delete(void* p){delete [] p;for(lmii=lmi.begin();lmii!=lmi.end();++lmii){if((*lmii).address==p) {lmi.erase(lmii);break;}}}void* operator new[](unsigned int size,char* file,int line){void* ptr = malloc(size);if(ptr!=NULL){MEM_INFO memInfo;memset(&memInfo,0,sizeof(MEM_INFO));memInfo.address = ptr;memInfo.size = size;strcpy(memInfo.file,file);memInfo.line = line;lmi.push_back(memInfo);}return ptr;}void operator delete[](void* p){delete [] p;for(lmii=lmi.begin();lmii!=lmi.end();++lmii){if((*lmii).address==p) {lmi.erase(lmii);break;}}}};int main(){MyClass* a = new(__FILE__,__LINE__) MyClass;MyClass* b = new(__FILE__,__LINE__) MyClass[5];for(lmii=lmi.begin();lmii!=lmi.end();++lmii){MEM_INFO memInfo=*lmii;cout

Tài liệu được xem nhiều: