![Phân tích tư tưởng của nhân dân qua đoạn thơ: Những người vợ nhớ chồng… Những cuộc đời đã hóa sông núi ta trong Đất nước của Nguyễn Khoa Điềm](https://timtailieu.net/upload/document/136415/phan-tich-tu-tuong-cua-nhan-dan-qua-doan-tho-039-039-nhung-nguoi-vo-nho-chong-nhung-cuoc-doi-da-hoa-song-nui-ta-039-039-trong-dat-nuoc-cua-nguyen-khoa-136415.jpg)
LẬP TRÌNH C nâng cao -BÀI 15 - AUTO_PTR, MUTABLE, VOLATILE VÀ ĐÁNH GIÁ TỐC ĐỘ CHƯƠNG TRÌNH
Số trang: 9
Loại file: pdf
Dung lượng: 158.67 KB
Lượt xem: 9
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:
L BÀI 15: AUTO_PTR, MUTABLE, VOLATILE VÀ ĐÁNH GIÁ TỐC ĐỘ CHƯƠNG TRÌNHauto_ptr Trong thư viện có định nghĩa lớp auto_ptr (nghĩa là con trỏ cấp phát và hủy bỏ vùng nhớ tự động) để giải quyết vấn đề rò rỉ bộ nhớ (tuy vậy vẫn có phiền toái, do đó lập trình viên tự cấp phát và giải phóng bộ nhớ vẫn là lựa chọn được khuyến khích hơn) Trong ví dụ dưới đây, p trỏ đến a (gọi là p sở hữu a) ..........
Nội dung trích xuất từ tài liệu:
LẬP TRÌNH C nâng cao -BÀI 15 - AUTO_PTR, MUTABLE, VOLATILE VÀ ĐÁNH GIÁ TỐC ĐỘ CHƯƠNG TRÌNH 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 15: AUTO_PTR, MUTABLE, VOLATILE VÀ ĐÁNH GIÁ TỐC ĐỘ CHƯƠNG TRÌNHauto_ptrTrong thư viện có định nghĩa lớp auto_ptr (nghĩa là con trỏ cấpphát và hủy bỏ vùng nhớ tự động) để giải quyết vấn đềrò rỉ bộ nhớ (tuy vậy vẫn có phiền toái, do đó lập trình viên tự cấp phát vàgiải phóng bộ nhớ vẫn là lựa chọn được khuyến khíchhơn)Trong ví dụ dưới đây, p trỏ đến a (gọi là p sở hữu a) Bạn không cần gọidelete a Khi chương trình kết thúc, destructor của p đượcgọi, p sẽ bị hủy, nó sẽ tự động huỷ luôn a cho bạn. Đó là mục đích củaauto_ptr, bạn không phải lo về leak memoryCODE#includeclass MyClass{int data;public:MyClass(int data):data(data){}friend ostream& operatorPerson *p = new Person;(*p).func();delete p;}catch(...)Dùng auto_ptr thì không lo việc ấy nữaCODEtry{auto_ptr p(new Person);(*p).func();}catch(...)Quá tuyệt phải không ? Không hẳn thế, bản thân auto_ptr cũng có nhiều rắcrối khác. Cũng cái ví dụ trên, ta sửa lại một chút. Lầnnày p sẽ chuyển quyền sở hữu a cho p2. Lần này sẽ sinh ra lỗi, vì p2 trỏ đếnvùng nhớ, chứ không phải p. Sau khi chuyển a cho p2sở hữu, lúc này p chẳng sở hữu cái gì cả (khỉ thật, lúc này p đang trỏ đến cáigì ? ai mà biết)CODEclass MyClass{int data;public:MyClass(int data):data(data){}friend ostream& operatorconst auto_ptr p(a);auto_ptr p2=p;Rắc rối thứ hai đó là auto_ptr không được dùng với cấu trúc bộ nhớ động,như mảng hay các bộ lưu trữ của STL như vector, listCODEint* a = new int[5];auto_ptr p(a);lí do là vì khi destructor của p được gọi, nó sẽ gọi delete a, chứ không phảidelete [] aVới các bộ lưu trữ của STL như vector, list, còn lí do là khi đưa phần tử vào,các bộ lưu trữ này chỉ sao chép giá trị của phần tử gốcvà sau đó làm việc với các bản sao chép. Trong khi với auto_ptr, các bản saochép này là KHÔNG giống nhau.Do đó tuỵệt đối không bao giờ dùng (dù chẳng thấy báo lỗi gì cả)CODEvector v;auto_ptr có một vài hàm tiện íchhàm resetp đã trỏ đến a rồi, bây giờ ta trỏ p đến b, thì vùng nhớ do a trỏ đến sẽ bị pháhủyCODEMyClass* a = new MyClass(5);coutp.reset(b);coutTrong trường hợp này const_cast là một giải pháp hết sức tránh, const_castkhông đảm bảo nó bỏ đi const với những object đượckhai báo const, do đó có thể gây ra lỗi không lường được, ví dụCODEclass MyClass{public:int a;MyClass(int a):a(a){}int affect() const{MyClass* mc = const_cast(this);return (*mc).a++;}};int main(){const MyClass m(6);coutcoutcoutVí dụ sau ta sẽ viết hàm wait (chờ tính theo giây) bằng cách dùng clock()CODEvoid wait(int seconds){clock_t waittime;waittime=clock()+seconds*CLOCKS_PER_SEC;while(clock()xác vì còn có sai số vì tùy theo nhiều yếu tố khác nữa nhưng như vậy cũngđủ dùng vì sai số không đáng kể. ở mức chấp nhậnđược.Những phần sau đã bị cắt: smart pointer, garbage collector và inlineassembly. Các bạn có thể tự tìm hiểu thêm nếu muốn.Môn lập trình C/C++ nâng cao đến đây kết thúc.
Nội dung trích xuất từ tài liệu:
LẬP TRÌNH C nâng cao -BÀI 15 - AUTO_PTR, MUTABLE, VOLATILE VÀ ĐÁNH GIÁ TỐC ĐỘ CHƯƠNG TRÌNH 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 15: AUTO_PTR, MUTABLE, VOLATILE VÀ ĐÁNH GIÁ TỐC ĐỘ CHƯƠNG TRÌNHauto_ptrTrong thư viện có định nghĩa lớp auto_ptr (nghĩa là con trỏ cấpphát và hủy bỏ vùng nhớ tự động) để giải quyết vấn đềrò rỉ bộ nhớ (tuy vậy vẫn có phiền toái, do đó lập trình viên tự cấp phát vàgiải phóng bộ nhớ vẫn là lựa chọn được khuyến khíchhơn)Trong ví dụ dưới đây, p trỏ đến a (gọi là p sở hữu a) Bạn không cần gọidelete a Khi chương trình kết thúc, destructor của p đượcgọi, p sẽ bị hủy, nó sẽ tự động huỷ luôn a cho bạn. Đó là mục đích củaauto_ptr, bạn không phải lo về leak memoryCODE#includeclass MyClass{int data;public:MyClass(int data):data(data){}friend ostream& operatorPerson *p = new Person;(*p).func();delete p;}catch(...)Dùng auto_ptr thì không lo việc ấy nữaCODEtry{auto_ptr p(new Person);(*p).func();}catch(...)Quá tuyệt phải không ? Không hẳn thế, bản thân auto_ptr cũng có nhiều rắcrối khác. Cũng cái ví dụ trên, ta sửa lại một chút. Lầnnày p sẽ chuyển quyền sở hữu a cho p2. Lần này sẽ sinh ra lỗi, vì p2 trỏ đếnvùng nhớ, chứ không phải p. Sau khi chuyển a cho p2sở hữu, lúc này p chẳng sở hữu cái gì cả (khỉ thật, lúc này p đang trỏ đến cáigì ? ai mà biết)CODEclass MyClass{int data;public:MyClass(int data):data(data){}friend ostream& operatorconst auto_ptr p(a);auto_ptr p2=p;Rắc rối thứ hai đó là auto_ptr không được dùng với cấu trúc bộ nhớ động,như mảng hay các bộ lưu trữ của STL như vector, listCODEint* a = new int[5];auto_ptr p(a);lí do là vì khi destructor của p được gọi, nó sẽ gọi delete a, chứ không phảidelete [] aVới các bộ lưu trữ của STL như vector, list, còn lí do là khi đưa phần tử vào,các bộ lưu trữ này chỉ sao chép giá trị của phần tử gốcvà sau đó làm việc với các bản sao chép. Trong khi với auto_ptr, các bản saochép này là KHÔNG giống nhau.Do đó tuỵệt đối không bao giờ dùng (dù chẳng thấy báo lỗi gì cả)CODEvector v;auto_ptr có một vài hàm tiện íchhàm resetp đã trỏ đến a rồi, bây giờ ta trỏ p đến b, thì vùng nhớ do a trỏ đến sẽ bị pháhủyCODEMyClass* a = new MyClass(5);coutp.reset(b);coutTrong trường hợp này const_cast là một giải pháp hết sức tránh, const_castkhông đảm bảo nó bỏ đi const với những object đượckhai báo const, do đó có thể gây ra lỗi không lường được, ví dụCODEclass MyClass{public:int a;MyClass(int a):a(a){}int affect() const{MyClass* mc = const_cast(this);return (*mc).a++;}};int main(){const MyClass m(6);coutcoutcoutVí dụ sau ta sẽ viết hàm wait (chờ tính theo giây) bằng cách dùng clock()CODEvoid wait(int seconds){clock_t waittime;waittime=clock()+seconds*CLOCKS_PER_SEC;while(clock()xác vì còn có sai số vì tùy theo nhiều yếu tố khác nữa nhưng như vậy cũngđủ dùng vì sai số không đáng kể. ở mức chấp nhậnđược.Những phần sau đã bị cắt: smart pointer, garbage collector và inlineassembly. Các bạn có thể tự tìm hiểu thêm nếu muốn.Môn lập trình C/C++ nâng cao đến đây kết thúc.
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 286 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 227 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 212 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 182 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 114 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