Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 19 kết quả

Đề tài: Sử dụng malloc() và free() ?

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    78

    Mặc định Sử dụng malloc() và free() ?

    Trong C++ ta cấp phát bộ nhớ cho một con trỏ
    PHP Code:
    = new int//cấp 1 ô nhớ
    = new int[elements]; //cấp 1 khối nhớ 
    và giải phóng bộ nhớ
    PHP Code:
    delete p//giải phóng 1 ô nhớ
    delete[] f//giải phóng cả khối nhớ 
    Nhưng trong C hàm free() nhận vào tham số là 1 con trỏ trỏ đến 1 ô nhớ, hay con trỏ trỏ đến địa chỉ ô đầu tiên của khối nhớ
    PHP Code:
    = (int*)malloc(10*sizeof(int));
    free(p); 
    Vậy sau những lệnh ở trên thì hàm free() sẽ giải phóng cả khối nhớ hay là chỉ giải phóng ô nhớ đầu tiên của khối nhớ ?

  2. #2
    Ngày gia nhập
    11 2008
    Bài viết
    186

    ấy, lại hiểu sai con trỏ rồi

    Con trỏ nó chỉ là lấy giá trị của một địa chỉ nào đó và coi như địa chỉ thực (bản chất là trỏ). Cho nên giải phóng ở đây là giải phóng bộ nhớ được cấp phát cho con trỏ thôi.

    trong C++
    delete p
    và delete[] f;
    cũng chỉ là một con trỏ được cấp phát một vùng, nên khi xóa cũng là xóa vùng đó.
    C và C++ như nhau, chỉ khác cách cấp phát bộ nhớ thôi.
    Giải phóng là giải phóng hết các thứ liên quan đến con trỏ
    Ước mơ vươn tới Linux Developer.
    Đang trong quá trình tập luyện:
    1. C system programming
    2. GNU distribution
    3. Gtk+/Gnome Application Programming.

    Bác nào giỏi lĩnh vực này giúp Kim với nha. Kim cám ơn nhiều !!!

  3. #3
    Ngày gia nhập
    11 2008
    Bài viết
    78

    nếu delete p và delete[] f tương tự nhau thì chẳng lẽ bài viết sau đây sai ?
    http://www.openandfree.org/blog/?p=33

    Q: Làm thế nào để cấp phát và giải phóng vùng nhớ cho một mảng các đối tượng
    A: Sử dụng p = new T[ n ] và delete [ ] p;

    Ví dụ, để cấp phát vùng nhớ cho một mảng chứa tối đa 100 đối tượng kiểu Fred, sau đó giải phóng vùng nhớ này, chúng ta dùng đoạn mã sau

    Fred* p = new Fred[ 100 ];
    ...
    delete [ ] p;

    Q: Điều gì sẽ xảy ra nếu chúng ta quên viết [ ] khi giải phóng vùng nhớ cấp phát bởi new T[ n ] ?
    A: Sẽ là một thảm họa.

    Người lập trình, chứ không phải trình dịch, có trách nhiệm đảm bảo rằng một vùng nhớ đã được cấp phát bởi lệnh T* p = new T[ n ] luôn phải được giải phóng bởi lệnh delete [ ] p. Nếu không làm vậy, sẽ chẳng có dòng thông báo lỗi nào xảy ra lúc biên dịch hay chạy chương trình cả. Tuy nhiên, vùng nhớ heap có thể bị phá hỏng hoặc chương trình bị đổ vỡ.

  4. #4
    Ngày gia nhập
    11 2008
    Bài viết
    186

    Trích dẫn Nguyên bản được gửi bởi howto Xem bài viết
    nếu delete p và delete[] f tương tự nhau thì chẳng lẽ bài viết sau đây sai ?
    http://www.openandfree.org/blog/?p=33
    tớ thấy đâu có sai nhỉ
    delete p và delete[] f giống nhau mà
    cấp phát kiểu nào thì phải xóa kiểu đó vì đây là cấp phát động kiểu heap

    p = new int; // 1 phần tử => delete p
    f = new int[100]; // mảng các phần từ => delete[] f

    còn trong C thì chỉ có stack thôi nên đơn thuần chỉ cần free() là ok
    Ước mơ vươn tới Linux Developer.
    Đang trong quá trình tập luyện:
    1. C system programming
    2. GNU distribution
    3. Gtk+/Gnome Application Programming.

    Bác nào giỏi lĩnh vực này giúp Kim với nha. Kim cám ơn nhiều !!!

  5. #5
    Ngày gia nhập
    11 2008
    Bài viết
    78

    Bạn nói rõ hơn vụ stack và heap này được không ?
    Hiz đi học mà chả bao giờ nghe thầy cô nào nói đến việc này

    Con trỏ nó chỉ là lấy giá trị của một địa chỉ nào đó và coi như địa chỉ thực (bản chất là trỏ). Cho nên giải phóng ở đây là giải phóng bộ nhớ được cấp phát cho con trỏ thôi.
    --> cái phần này thì tớ hiểu nhưng tớ thắc mắc là nếu con trỏ trỏ đến cả một khối nhớ thì khi free() nó sẽ giải phóng tất cả hay chỉ là ô đầu tiên của dãy nhớ mà con trỏ trỏ tới.
    Tương tự như vậy khi nếu cấp 1 dãy nhớ cho con trỏ f = new int[100] thì khi "delete f" nó sẽ giải phóng ô đầu tiên của dãy hay tất cả --> điểm này được tác giả cánh báo gây nguy hiểm !!!
    Đã được chỉnh sửa lần cuối bởi howto : 30-11-2008 lúc 09:59 AM.

  6. #6
    Ngày gia nhập
    11 2008
    Bài viết
    186

    Mặc định Sử dụng malloc() và free() ?

    Trích dẫn Nguyên bản được gửi bởi howto Xem bài viết
    Bạn nói rõ hơn vụ stack và heap này được không ?
    Hiz đi học mà chả bao giờ nghe thầy cô nào nói đến việc này

    --> cái phần này thì tớ hiểu nhưng tớ thắc mắc là nếu con trỏ trỏ đến cả một khối nhớ thì khi free() nó sẽ giải phóng tất cả hay chỉ là ô đầu tiên của dãy nhớ mà con trỏ trỏ tới.
    Tương tự như vậy khi nếu cấp 1 dãy nhớ cho con trỏ f = new int[100] thì khi "delete f" nó sẽ giải phóng ô đầu tiên của dãy hay tất cả --> điểm này được tác giả cánh báo gây nguy hiểm !!!
    Bây giờ không cần biết làm gì, chỉ cần biết sử dụng sao cho hợp lý là được; vì Kim cũng chỉ mới biết lập trình và biết có bấy nhiêu thôi nên cũng chịu.
    Thử mời các đại ca khác của Cviệt xem.

    Kim thích câu này của một anh trong FPT đã từng nhắc Kim:
    " Mới hoc thì không nên hiểu quá sâu dẫn đến không hiểu gì hết. "

    Bạn thử google xem có ra tin tức gì không
    Ước mơ vươn tới Linux Developer.
    Đang trong quá trình tập luyện:
    1. C system programming
    2. GNU distribution
    3. Gtk+/Gnome Application Programming.

    Bác nào giỏi lĩnh vực này giúp Kim với nha. Kim cám ơn nhiều !!!

  7. #7
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    http://forums.congdongcviet.com/showthread.php?t=10873

    Có nói về stack và heap đấy.
    Phá toái hư không - Bạch nhật thăng thiên.

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Tất cả câu trả lời của bạn nằm trong đây : http://www.daniweb.com/forums/thread7497.html

    Một thời gian tui cũng có thắc mắc như bạn

  9. #9
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Vậy sau những lệnh ở trên thì hàm free() sẽ giải phóng cả khối nhớ hay là chỉ giải phóng ô nhớ đầu tiên của khối nhớ ?
    Xin phép quay lại câu hỏi đầu tiên nhé. free hay delete giống nhau, khi cấp phát một khối nhớ như một mảng, thì nó không del đc hết cả khối.

    Bằng chứng là các bạn hãy đọc 2 test này:
    C Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. int main()
    5. {
    6.     int *a, *b;
    7.     a = (int*) malloc (12);
    8.     a[0]=1; a[1]=2; a[2]=3;
    9.     b=a;
    10.     printf("%d  %d\n",b[0],b[2]);
    11.     free(a);
    12.     printf("%d  %d\n",b[0],b[2]);
    13. }
    - kq:
    1 3
    0 3

    C++ Code:
    1. #include <iostream>
    2.  
    3. int main()
    4. {
    5.     int *a, *b;
    6.     a = new int[3];
    7.     a[0] = 6; a[1]=7; a[2]=8;
    8.     b = a;
    9.     std::cout << b[0] << "  " << b[2] << std::endl;
    10.     delete[] a;
    11.     std::cout << b[0] << "  " << b[2];
    12. }
    - Kq:
    6 8
    0 8
    Mình có một câu này muốn nói khi các bạn học lập trình: "Luôn cố gắng tìm cặn kẽ nguyên nhân, luôn nghi ngờ người khác nói, tự ta sẽ kiểm chứng lại nhiều lần trước khi nói: ừ đúng"

    @howto: Cố gắng tự mình kiểm tra bằng cách như trên trước khi hỏi. Cảm ơn howto vì trước mình cũng không để ý điều này.

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Code của QuangHoang dùng g++ sẽ cho ra kết quả trên, dùng Visual C++ sẽ ra trash cho cả 3 giá trị. Cái này chắc chắn là bug của g++, code đó không thể ra kết quả sau khi delete[] a; được gọi. Em nên để ý lỗi này của g++.

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

  1. Kỹ thuật C Hàm free trong malloc.h...
    Gửi bởi lytieubinh_269 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 20-11-2011, 02:33 PM
  2. Free Movie Downloads Sites | Download Free Full Length Movies:MovieServe.Net
    Gửi bởi digiman87 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: 30-03-2011, 10:15 AM
  3. Free Movie Downloads- The Best Sites for Free Movies-MovieServe.Net
    Gửi bởi digiman87 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: 28-03-2011, 02:17 PM
  4. Cơ chế hoạt động của malloc, new và free, delete như thế nào?
    Gửi bởi ghost_dragonking trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 19-10-2010, 07:53 AM
  5. Lỗi bộ nhớ free malloc trong VC++
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 28-12-2009, 12:57 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