intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

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

Chia sẻ: Yukogaru | Ngày: | Loại File: PDF | Số trang:5

103
lượt xem
18
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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. ...

Chủ đề:
Lưu

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

  1. LẬP TRÌNH C/C++ NÂNG CAO Yê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à 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. 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ông thể. Đây là một trong những lí do vì sao malloc/free vẫn còn hữu dụng cho dù đã có new/delete Ví 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ản overload của các toán tử này đã được gọi CODE #include #include using 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
  2. } void operator delete(void* p) { cout
  3. Cò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 #include using 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;
  4. 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;
  5. 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
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2