Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Cấp phát, giải phóng vùng nhớ trong C++. Sau khi delete []p thì gán p=NULL có tác dụng gì?

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

    Mặc định Cấp phát, giải phóng vùng nhớ trong C++. Sau khi delete []p thì gán p=NULL có tác dụng gì?

    Mình đã từng đọc trên 4rum như thế này:

    Cấp phát vùng nhớ:
    C++ Code:
    1. char *p=new char[1000];

    Giải phóng vùng nhớ:
    C++ Code:
    1. delete []p;
    2. //Recommend set p to null after free its memory
    3. p=NULL;
    Mình thắc mắc ở chổ là sau khi delete []p thì gán p=NULL có ý nghĩa gì, mong mọi người giải thích dùm.
    Cảm ơn

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Thâm sơn cùng cốc
    Bài viết
    825

    Sau khi bạn giải phóng vùng nhờ bằng toán tử delete thì vùng nhớ do con trỏ p trỏ tới đã được thu hồi, nhưng con trỏ p thì vẫn trỏ tới vùng nhớ đó. Do đó người ta nên gán p=NULL sau khi hủy cấp phát để sau này có thể kiểm tra được là vùng nhớ do p trỏ tới đã được cấp phát hay chưa.
    C++ Code:
    1. char *p=new char[1000];
    2. delete []p;
    3. p=NULL;
    4. if (p==NULL)
    5. {
    6.  printf("pointer p points to unallocated memory!\n");
    7. }
    8. else
    9. {
    10.  printf("pointer p pointts to allocated memory, now you can do anything with the memory is pointed by p\n");
    11. }
    Đã được chỉnh sửa lần cuối bởi Tadius : 09-09-2011 lúc 11:02 AM.

  3. #3
    Ngày gia nhập
    07 2011
    Nơi ở
    Modova
    Bài viết
    123

    Chào Tadius, mình thấy code của bạn có vẻ không hợp lý khi giải thích vấn đề trên, mặc dù mình không thể giải thích được ý của người hỏi chính nhưng mình xin bàn một số vấn đề bất hợp lý trong bài trả lời của bạn, bạn có thể không hài lòng nhưng mình vẫn muốn nói, mình cảm ơn bạn vì bạn đã lắng nghe: Theo mình thấy thì lệnh if của bạn không giải quyết được vấn đề gì hết, vì lúc này bạn đã gán p=NULL rồi thì việc kiểm tra p có bằng hay không bằng NULL là thừa, vì mặc nhiên nó bằng NULL rồi mà, phải không bạn? Mong bạn cho ý kiến, thân mến, Moscow.
    A good beginning and a good ending !

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Code của bạn tadius là để ví dụ cho 1 trong những tác dụng của việc gán = NULL. Chứ không có nghĩa là lệnh kiểm tra ở ngay sau lệnh gán bằng NULL trong 1 chương trình thực tế

    Tác dụng chủ yếu là như tadius nói, để phân biệt giữa 1 con trỏ hợp lệ (trỏ đến vùng nhớ được cấp phát) và con trỏ không hợp lệ. Ngoài ra, việc gán NULL còn có ý nghĩa nhỏ như sau: Nếu bạn delete 1 pointer không hợp lệ (không trỏ đến một vùng nhớ đang được cấp phát) thì sẽ gây lỗi. Nếu vì 1 lý do gì đó bạn delete pointer p rồi, sau đó lại delete thêm 1 lần nữa ==> bùm, chương trình có thể crash ngay. Tuy nhiên bạn được phép gọi lệnh delete đối với 1 NULL pointer (sẽ không thực hiện gì cả). Bạn không cần phải check 1 pointer có phải là NULL hay không trước khi delete nó.

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Chính xác đấy Moscow ah, Tadius không miêu tả được rõ nghĩa vấn đề mà thôi. Trong lập trình C/C++, việc gán giá trị con trỏ = NULL lúc khai báo và sau khi giải phóng là việc làm khuyến cáo.

    Các trường hợp lệnh gán p = NULL có tác dụng điển hình là:
    - p là biến global được sử dụng trong nhiều hàm khác nhau của chương trình C
    - p là biến thành viên của class

    PS: Tadius nhầm thông điệp ở điều kiện kiểm tra, phải đổi chỗ 2 câu lệnh printf mới đúng.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  6. #6
    Ngày gia nhập
    07 2011
    Nơi ở
    Modova
    Bài viết
    123

    Mặc định Cấp phát, giải phóng vùng nhớ trong C++. Sau khi delete []p thì gán p=NULL có tác dụng gì?

    Chào bạn fbchicken, mình không quan tâm tới chuyện sau khi delete []p thì chuyện gì sẽ đến với p, nhưng khi đã gán p=NULL rồi mà lại đi kiểm tra xem nó có bằng hay không bằng NULL thì là một việc làm theo mình nghĩ là không cần thiết, bạn có nghĩ vậy không? Thân mến, Moscow.

    Bạn Kevin Hoang, cảm ơn bạn đã bớt chút thời gian trao đổi cùng mình, nhưng mình vẫn giữ ý kiến đầu tiên của mình, mình không hiểu nhiều về con trỏ nhưng mình thấy sự logic của việc kiểm tra trên có vẻ như không đúng cho lắm, mong bạn và các bạn khác hiểu những ý mình đang diễn đạt, có lẽ mình rất xấu hổ vì văn diễn đạt của mình không tốt khiến các bạn khó hiểu, nếu vậy thì mình thành thật xin lỗi và mình xin hết ý kiến, cảm ơn các bạn, thân mến, Moscow.
    A good beginning and a good ending !

  7. #7
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Ồ, bạn không hiểu à? Cái code đó chỉ là ví dụ chứ không có nghĩa là việc check bằng NULL ở ngay sau khi gán bằng NULL. Bạn cứ coi phần code trong bài của tadius viết là 2 đoạn rời rạc, đoạn đầu là copy nguyên phần bạn viết, đoạn 2 là code kiểm tra. Code kiểm tra sẽ có thể nằm ở 1 function khác, 1 class khác, 1 file khác, khi mà không ai chắc chắn được p có đang bằng NULL hay không.

  8. #8
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Không chỉ là việc kiểm tra ở function khác, class khác mà có thể là một người khác, một người không hề biết là bạn đã làm gì với con trỏ p.

    @Moscow: Hãy sử dụng chức năng chỉnh sửa bài viết, nếu bạn không muốn bị cấm tham gia vài ngày để nghiên cứu luật lệ tham gia.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  9. #9
    Ngày gia nhập
    07 2011
    Nơi ở
    Modova
    Bài viết
    123

    Bạn fbchicken thân mến, mình nghĩ lại rồi, theo như ý kiến của bạn thì mình thấy nếu bạn Tadius đặt hai đoạn code đó riêng biệt nhau ra thì mình sẽ không hiểu lầm như vậy, một lần nữa rất cảm ơn bạn, mình sẽ tìm hiểu thêm, thân mến, Moscow.

    @Kevin Hoang: Cảm ơn bạn, mình sẽ cố gắng, hhy vọng nhận được sự giúp đỡ của các bạn.
    A good beginning and a good ending !

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

  1. Bài tập C++ Vấn đề quản lý bộ nhớ set=null trước khi delete có hợp lý không?
    Gửi bởi duythanhnguyen trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 16-09-2013, 10:54 PM
  2. Kỹ thuật C++0x lỗi thực thi khi giải phóng vùng nhớ của con trỏ đối tượng?
    Gửi bởi xuanvinhtd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 01-12-2012, 05:21 AM
  3. Lập trình C++ [Thắc mắc] Khi giải phóng thì vùng nhớ có trả về cho hdh k ?????
    Gửi bởi dehin trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 31-08-2012, 11:39 PM
  4. sự khác nháu giữa NULL và delete?
    Gửi bởi nthung trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 09-09-2010, 09:39 AM
  5. Lỗi khi giải phóng vùng nhớ sau khi cấp phát động
    Gửi bởi khoadangnguyen trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 01-08-2008, 09:55 AM

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