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
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ìm kiếm theo từ khóa liên quan:
kỹ thuật lập trình lập trình c/c++ nâng cao lập trình c/c++ thủ thuật lập trình c ngôn ngữ lập trình nâng caTài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 290 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 228 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 217 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 184 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 156 0 0 -
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 122 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 116 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 111 0 0 -
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 trang 109 0 0 -
Giáo trình Nhập môn lập trình VB6: Phần 2
184 trang 99 0 0