Hì vấn đề bộ nhớ có khá nhiều cái hay, mình rất khoái các vấn đề liên quan đến hệ thống, nhưng do chưa thể dùng nó để kiếm sống được nên đã quẳng vào kho hơi lâu. Hôm nay có bác Tư Triều vào lục lại giùm thì cảm ơn nhiều quá. Những điều mình nói ở đây mang tính chất bàn luận, bác nào thấy sai thì sửa giúp.
Tư Triều said:

May quá có người quan tâm giúp rồi.
Xóa bộ nhớ sao lại phải xóa 2 lần như thế ạ, em tưởng
delete diem là đựoc chứ ạ, cần cả vòng lặp để xóa như thế kia nữa hả bác??
hix, tèo rồi, cấp phát phải dùng vòng for thì xoá cũng phải dùng vòng for chứ
Nếu bạn khai báo **diem nghĩa là sao? Bạn hình dung được ko?
- Nếu ban khai báo CPoint diem[n][m] có nghĩa là bạn đã cấp phát tính 1 khối bộ nhớ mà mình thường gọi là 1 ma trận có kích thước n x m. Nhưng thực tế không phải vậy, thực tế thì khối bộ nhớ này là liên tiếp nhau, mình hoàn toàn có thể dùng 1 vòng for để tra cứu, thay đổi vùng nhớ này (không cần dùng 2 vòng for như ta vẫn thường dùng).
- Còn nếu bạn khai báo CPoint **diem tức là mình
muốn có 1 khối nhớ chưa biết trước kích thước. Khi nào mình cần dùng bao nhiêu thì sẽ xin bấy nhiêu. Tại sao phải làm vậy, mục đích chính chẳng qua là để tận dụng không gian nhớ. Chắc bạn đã nghe tới chuyện phân mảnh bộ nhớ chứ? Tại sao, nếu bạn đã học về Hệ điều hành thì chắc biết rằng sẽ có trường hợp là bộ nhớ còn dư rất nhiều nhưng khi mình xin cấp phát 1 miếng thì OS lại báo là "hết bộ nhớ rồi bác à", đó là trường hợp phân mảnh bộ nhớ. Vấn đề này mình tạm dừng ở đây vì nói ra sẽ rất dài dòng, đụng tới quản lý tài nguyên của OS mà, nếu bạn có nhã hứng thì mình chờ ý kiến của bạn để tiếp tục câu chuyện. Quay lại vấn đề chính: bạn đã bao giờ có nhu cầu cần 1 mảng mà mảng đó có dạng m x nj ko? Có nghĩa là mình cần 1 mảng mà có m hàng, mỗi hàng bây giờ không còn là n cột nữa, mà hàng 1 có 4 cột, hàng 2 có 10 cột, hàng 3 có 6 cột, ... hì, tạm dừng vấn đề nhé. Tiếp tục quay lại vấn đề, bạn hỏi là tại sao phải cùng vòng for để xoá: thế bạn khai báo CPoint **diem nghĩa là sao? Nghĩa là con trỏ của con trỏ, đúng ko? Mà con trỏ thì phải dùng delete, thế con trỏ của con trỏ thì phải dùng 2 lần delete chứ sao. Tóm lại bạn có thể hình dung là mảng các con trỏ thì phải dùng vòng for để del, đúng ko?
Tư Triều said:
Cấp phát dần có nghĩa là biến n, và trong a[n][m] trong từng trường hợp là khác nhau ( nhưng đều <500). Em mới nghĩ cấp phát dần là cách làm để tiết kiệm bộ nhớ nhất.
Như vậy, mỗi lần cấp phát lại bạn phải del cái cũ đi rồi cấp phát cái mới hoặc bản phải dùng các hàm hỗ trợ.
Tư Triều said:
Bác cho em hỏi, cách của bác với cách khai thẳng
int ARR[500][10] là không khác nhau đúng không ?
Sao bạn lại hỏi thế này nhỉ? Bạn đọc phần trả lời trên cùng của mình chắc sẽ hình dung ra. Câu trả lời là khác
rất xa nhau. Đặc biệt sẽ thể hiện rõ khi bạn cần 1 mảng kích thích lớn, chẳng hạn: 9999999 x 9999999. Ai mà cũng khai báo dạng CPoint diem[9999999][9999999] thì chắc là sẽ khổ bác Bill lắm đây.
Tư Triều said:
khai báo ngay từ đầu int ARR[500][10] trong eVC là nó cấp phát bộ nhớ luôn đúng không ạ ?
Đúng. (Nhưng đừng ạ, mình ngại lắm, mình còn ít tuổi lắm

)
Tư Triều said:
Sao trong một số trường hợp khai báo như kiểu của bác, dùng xong delete đi thì lỗi thiếu bộ nhớ, trong khi khai báo ngay từ đầu kiểu int ARR[500][10] lại không lỗi bộ nhớ?
Hì bởi vì bạn dùng chưa đúng, bạn del có 1 lần thôi chứ gì?
Tư Triều said:
Có cách nào để biết được các thông số về bộ nhớ, quản lý bộ nhớ của chương trình mình làm không các bác
VC ở chế độ debug thông báo rất rõ, hoặc mình có thể làm các test case.
Tư Triều said:
Xin chân thành cảm ơn .
Không có chi, khách sáo quá, trao đổi học hỏi kinh nghiệm là chính thôi mà
