Trang 3 trên tổng số 5 Đầu tiênĐầu tiên 12345 Cuối cùngCuối cùng
Từ 21 tới 30 trên tổng số 48 kết quả

Đề tài: Bản chất của việc cấp phát bộ nhớ động và giải phóng bộ nhớ

  1. #21
    Ngày gia nhập
    09 2009
    Bài viết
    2

    Mặc định Bản chất của việc cấp phát bộ nhớ động và giải phóng bộ nhớ

    mấy bác cho em hỏi cái này cũng liên quan đến thủ thuật cấp phát,như khi làm code từ điển,thì để C tự động nạp vào từ đã có sẵn trong file thì nên làm sao??? nghĩa là load xong đợt này,khi bấm lên hay xuống thì sẽ tự động load vào những từ đã xem hoặc chưa xem???có thể theo dslk đơn hoặc tuyến tính gì cũng được

  2. #22
    Ngày gia nhập
    09 2010
    Bài viết
    88

    cho em hỏi:
    1. khi nào dùng new, khi nào dùng malloc?
    2. khi free hoăc delete chỉ đơn thuần là thông bào vùng nhớ đó đã được giải phóng. vậy có khi nào chẳng may khai báo 1 biến khác mà PC cấp cho nó vùng nhớ a (b) đang trỏ tới ?

  3. #23
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    new và malloc đều được, new đi chung với delete, malloc đi chung với free. Vùng nhớ đã free tức là nó được đánh dấu là đang rảnh, và nó hoàn toàn có thể được cấp lại cho con trỏ khác. Tái sử dụng bộ nhớ là điều hiển nhiên phải làm, ko phải hên xui gì cả. Những vùng nhớ đã cấp phát mà chưa giải phóng thì ko thể cấp lại cho con trỏ khác được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #24
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Bản chất của free(): free() thực chất ra là việc call trực tiếp HeapFree() trong winbase.h, đây là prototype của HeapFree():
    PHP Code:
    BOOL WINAPI HeapFree(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem); 
    Khi đó nếu free(n) được gọi thì lpMem được set là n, còn dwFlags được set là 0.
    Có đôi điều muốn chia sẻ với các bạn. Have fun!
    Đã được chỉnh sửa lần cuối bởi peterdrew : 05-01-2011 lúc 05:37 PM.

  5. #25
    Ngày gia nhập
    02 2011
    Nơi ở
    Hà Nội
    Bài viết
    67

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    tiếp theo
    PHP Code:
    free(b);
    delete []a
    2 câu lệnh này ko có làm thay đổi giá trị của a và b. a và b vẫn trỏ vào mảnh đất đấy. ok ? Và càng ko can thiệp vào vùng nhớ mà a ,b trỏ đến, cái duy nhất mà nó làm là xác nhận vùng nhớ đó đã được trả lại, đang rảnh rỗi, có thể cho thuê tiếp.

    <<< điều này giải thích cho cách hiểu sai lầm của 1 số bạn mới học đối với việc cấp phát và giải phóng
    Anh cho em hỏi rõ hơn về đoạn này. Khi giải phóng rồi mà a và b vẫn trỏ đến mảnh đất đó thì nghĩa là nó vẫn có quyền kiểm soát khu vực đó, như vậy thì sao biết là khi đó đất là available đựoc ạ. Em có test một đoạn chương trình như sau.
    C Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. int main(){
    5.     int *p;
    6.    
    7.     p= new int[2]; // xin chính quyền cấp hai khu đất
    8.     p[0]=8888; // khu này trồng rau
    9.     p[1]=9999; // khu này nuôi lợn
    10.     cout << p[0] << "  " << p[1] << endl; // xem tình hình ruộng rau và chuồng lợn
    11.    
    12.     delete [] p; // trả lại đất cho chính quyền
    13.     cout << p[0] << "  " << p[1] << endl; // xem chính quyền làm gì với ruộng rau và chuồng lợn
    14.    
    15.     system("pause");
    16.     return 0;
    17. }
    kết quả là em không thấy ruộng rau và chuồng lợn đâu nữa


    em nghĩ có hai nguyên nhân
    • Thứ nhất: chính quyền đã làm gì đó với ruộng rau và chuông lợn của em (sửa đổi nội dung của vùng nhớ mà trước đó p trỏ tới, thay đổi 8888 và 9999) nhưng như anh nói nó không can thiệp vào.
    • Thứ hai: em nhìn nhầm sang một khu đất khác chứ không phải khu đất lúc trước nữa. Nhưng anh nói sau khi bị tứoc đoạt quyền sử dụng đất thì em vẫn nhìn vào khu đất đó (p vẫn trỏ tới vùng nhớ mà trước đó nó trỏ tới)

    Nếu thế thì em không giải thích được kết quả của chương trình trên. Anh giải thích kỹ hơn giùm em với. Cám ơn anh
    Vấn đề không phải là bước nhanh, mà là luôn luôn bước

  6. #26
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Mặc định Bản chất của việc cấp phát bộ nhớ động và giải phóng bộ nhớ

    Trích dẫn Nguyên bản được gửi bởi first_pace Xem bài viết
    Anh cho em hỏi rõ hơn về đoạn này. Khi giải phóng rồi mà a và b vẫn trỏ đến mảnh đất đó thì nghĩa là nó vẫn có quyền kiểm soát khu vực đó, như vậy thì sao biết là khi đó đất là available đựoc ạ. Em có test một đoạn chương trình như sau.
    C Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. int main(){
    5.     int *p;
    6.    
    7.     p= new int[2]; // xin chính quyền cấp hai khu đất
    8.     p[0]=8888; // khu này trồng rau
    9.     p[1]=9999; // khu này nuôi lợn
    10.     cout << p[0] << "  " << p[1] << endl; // xem tình hình ruộng rau và chuồng lợn
    11.    
    12.     delete [] p; // trả lại đất cho chính quyền
    13.     cout << p[0] << "  " << p[1] << endl; // xem chính quyền làm gì với ruộng rau và chuồng lợn
    14.    
    15.     system("pause");
    16.     return 0;
    17. }
    kết quả là em không thấy ruộng rau và chuồng lợn đâu nữa


    em nghĩ có hai nguyên nhân
    • Thứ nhất: chính quyền đã làm gì đó với ruộng rau và chuông lợn của em (sửa đổi nội dung của vùng nhớ mà trước đó p trỏ tới, thay đổi 8888 và 9999) nhưng như anh nói nó không can thiệp vào.
    • Thứ hai: em nhìn nhầm sang một khu đất khác chứ không phải khu đất lúc trước nữa. Nhưng anh nói sau khi bị tứoc đoạt quyền sử dụng đất thì em vẫn nhìn vào khu đất đó (p vẫn trỏ tới vùng nhớ mà trước đó nó trỏ tới)

    Nếu thế thì em không giải thích được kết quả của chương trình trên. Anh giải thích kỹ hơn giùm em với. Cám ơn anh

    xin khẳng định lại 1 lần nữa, e đã hiểu hoàn toàn sai lầm, FREE và DEL ko bao giờ thay đổi giá trị của con trỏ, hãy phân việt rõ ràng giữa giá trị của con trỏ và giá trị nó trỏ đến

    free nó là void free(void *mem) vậy thì xin hỏi con trỏ mem làm sao có thể thay đổi giá trị qua hàm này (xin hãy đọc bài bản chất con trỏ trong C để hiểu sâu hơn vấn đề này, tip : phân biệt rõ ràng giữa giá trị của mem và giá trị của thằng mà mem trỏ tới)


    check lại đoạn code sau đây
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. int main(){
    5.     int *p;
    6.  
    7.     p= new int[2]; // xin chính quyền cấp hai khu đất
    8.     p[0]=8888; // khu này trồng rau
    9.     p[1]=9999; // khu này nuôi lợn
    10.     cout << p[0] << "  " << p[1] << endl; // giá trị trỏ đến
    11.     printf("%x\n",p);     // giá trị của p <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    12.    
    13.  
    14.     delete [] p; // trả lại đất cho chính quyền
    15.     cout << p[0] << "  " << p[1] << endl; // xem chính quyền làm gì với ruộng rau và chuồng lợn
    16.     printf("%x\n",p); // giá trị của p  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    17.  
    18.     system("pause");
    19.     return 0;
    20. }



    điều nữa
    Giải bộ nhớ hoạt động như thế nào : bản chất là trả lại quyền sử dụng
    khi này :
    + sở sẽ thu lại quyền sử dụng đất của anh, thế là đủ rồi, sở ko cần phải động chạm sửa chữa lại gì vùng đất đó. Nên khi đó dù vùng đất đó đã được giải phóng nhưng mà hoa màu của a ta trên đó thì vẫn còn, ko có biến mất được

    điều này giải thích tại sao khi mà nhiều bạn thử giải phóng bộ nhớ rồi, delete rồi, free rồi mà khi in thử ra vẫn thấy kết quả như thế .
    đơn giản thôi, a ta trả lại mảnh đất đó, nhưng chưa có ai thuê nó cả, chưa có ai sử dụng nên hôm sau ra xem thử thì nó vẫn như hôm trước khi a ta trả lại
    giả sử ngay khi em vừa trả , có thằng khác nó đến thuê luôn thì lập tức nó bỏ hoa màu của em đi, trồng hoa màu khác thì em quay lại làm gì còn thời đại này nhanh như ăn cắp ý mà

    (windows có bao nhiêu process, thread,? nên việc bị thuê ngay lập tức là quá bình thường, em à, đặc biệt nếu là hàng nằm trên stack thì thay đổi liên tục là bt)
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  7. #27
    Ngày gia nhập
    02 2011
    Nơi ở
    Hà Nội
    Bài viết
    67

    Thanks anh, giá trị của con trỏ và giá trị của vùng nhớ mà con trỏ trỏ tới thì em biết. Em chỉ thắc mắc không hiểu tại sao khi kiểm tra lại thì giá trị của vùng nhớ lại bị thay đổi (8888 và 9999) nên em với đặt ra hai khả năng:
    • Thứ nhất: chính quyền đã làm gì đó với ruộng rau và chuông lợn của em (sửa đổi nội dung của vùng nhớ mà trước đó p trỏ tới, thay đổi 8888 và 9999) nhưng như anh nói nó không can thiệp vào.
    • Thứ hai: em nhìn nhầm sang một khu đất khác chứ không phải khu đất lúc trước nữa. Nhưng anh nói sau khi bị tứoc đoạt quyền sử dụng đất thì em vẫn nhìn vào khu đất đó (p vẫn trỏ tới vùng nhớ mà trước đó nó trỏ tới)
    Và theo câu trả lời của anh nó rơi vào khả năng thứ nhất, bị thằng nào đó thuê lại ngay sau đó:
    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết

    giả sử ngay khi em vừa trả , có thằng khác nó đến thuê luôn thì lập tức nó bỏ hoa màu của em đi, trồng hoa màu khác thì em quay lại làm gì còn thời đại này nhanh như ăn cắp ý mà

    (windows có bao nhiêu process, thread,? nên việc bị thuê ngay lập tức là quá bình thường, em à, đặc biệt nếu là hàng nằm trên stack thì thay đổi liên tục là bt)
    Thanks anh đã giải đáp đoạn này, em không biết là nó lại bị thuê luôn như thế, em hiểu rồi
    Vấn đề không phải là bước nhanh, mà là luôn luôn bước

  8. #28
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi first_pace Xem bài viết
    Thanks anh, giá trị của con trỏ và giá trị của vùng nhớ mà con trỏ trỏ tới thì em biết. Em chỉ thắc mắc không hiểu tại sao khi kiểm tra lại thì giá trị của vùng nhớ lại bị thay đổi (8888 và 9999) nên em với đặt ra hai khả năng:
    • Thứ nhất: chính quyền đã làm gì đó với ruộng rau và chuông lợn của em (sửa đổi nội dung của vùng nhớ mà trước đó p trỏ tới, thay đổi 8888 và 9999) nhưng như anh nói nó không can thiệp vào.
    • Thứ hai: em nhìn nhầm sang một khu đất khác chứ không phải khu đất lúc trước nữa. Nhưng anh nói sau khi bị tứoc đoạt quyền sử dụng đất thì em vẫn nhìn vào khu đất đó (p vẫn trỏ tới vùng nhớ mà trước đó nó trỏ tới)

    Và theo câu trả lời của anh nó là khả năng thứ nhất, bị thằng nào đó thuê lại ngay sau đó:

    Thanks anh đã giải đáp đoạn này, em không biết là nó lại bị thuê luôn như thế, em hiểu rồi
    khi em cài hook bắt các API trên window sẽ thấy LocalAlloc, RemoteAlloc,GlobalAlloc... được xài rất nhiều lần trên /1s chứ ko phải (ví dụ nhỏ xem ở hình dưới , đó là chỉ trong 1 tiến trình firefox thôi đó, chứ ko phải xét trên 5x process đang chạy)


    tuy nhiên đối với các môi trường cũ, đặc biệt như trên borland C for dos thì hiện tượng free rồi mà còn tài nguyên rất hay xảy ra, có rât rất nhiều người hiểu lầm là lỗi, rồi ... (đã có rất nhiều câu hỏi như thế trong box thắc mắc C). đó là lý do vì sau a phải nhấn mạnh điều đó

    Attached Thumbnails Attached Thumbnails apim.png  
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  9. #29
    Ngày gia nhập
    08 2010
    Bài viết
    82

    Phải nói bác langman hiểu vấn đề rất uyên thâm và trình bày vấn đề thì cực kì rõ ràng, dễ hiểu. Xin phép bác cho tôi lấy bài viết của bác về chỉnh sửa làm tài liệu để tham khảo được không?

  10. #30
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi soldtheworld Xem bài viết
    Phải nói bác langman hiểu vấn đề rất uyên thâm và trình bày vấn đề thì cực kì rõ ràng, dễ hiểu. Xin phép bác cho tôi lấy bài viết của bác về chỉnh sửa làm tài liệu để tham khảo được không?
    cám ơn bạn, cái đó thì ok bạn à, chỉ cần các bạn học tấp tốt là ok rồi.
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

Các đề tài tương tự

  1. Trả lời: 1
    Bài viết cuối: 09-03-2014, 08:09 PM
  2. Trả lời: 0
    Bài viết cuối: 07-05-2013, 09:40 AM
  3. Trả lời: 1
    Bài viết cuối: 09-03-2013, 10:08 AM
  4. Chung Cư 257 Giải Phóng, st/cn Chung Cư 257 Giải Phóng với DT: 81m, 33tr
    Gửi bởi datphat191 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 16-02-2012, 01:37 PM
  5. Giải phóng bộ nhớ như thế nào để chương trình chạy nhanh?
    Gửi bởi toanhoi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 03-09-2010, 01:14 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn