Announcement

Collapse
No announcement yet.

Cho hỏi rõ về bản chất của con trỏ và hủy con trỏ. xóa cấp phát

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Cho hỏi rõ về bản chất của con trỏ và hủy con trỏ. xóa cấp phát

    có 1 con trỏ kiệu type :
    và gán cho nó địa chỉ của của 1 biến hằng gì cũng kiểu type luôn.
    thì nghĩa là trên ram có 1 ô nhớ ab..xy gì đấy đang bị dùng và có giá trị ta gán (rồi nó bị đánh dấu là đang bị dùng)ko trình nào dc dùng ẻm nữa.
    sau đó thì ta free hay delete cái con trỏ ấy thì cái gì sẽ mất.cái đánh dấu mất (nghĩa là nó đang lơ lững chưa dùng trong ram) hay là chính địa chỉ con trỏ mất hay cái gì bị mất đi?
    Xin cho câu trả lời thật chính xác

  • #2
    Con trỏ còn, giá trị ô nhớ còn, chỉ có quyền sử dụng ô nhớ của con trỏ bị mất.
    ------"Some Will, Some Won't, So What? Someone's Waiting!"------

    Comment


    • #3
      Originally posted by 13520797 View Post
      có 1 con trỏ kiệu type :
      và gán cho nó địa chỉ của của 1 biến hằng gì cũng kiểu type luôn.
      thì nghĩa là trên ram có 1 ô nhớ ab..xy gì đấy đang bị dùng và có giá trị ta gán (rồi nó bị đánh dấu là đang bị dùng)ko trình nào dc dùng ẻm nữa.
      sau đó thì ta free hay delete cái con trỏ ấy thì cái gì sẽ mất.cái đánh dấu mất (nghĩa là nó đang lơ lững chưa dùng trong ram) hay là chính địa chỉ con trỏ mất hay cái gì bị mất đi?
      Xin cho câu trả lời thật chính xác
      Câu hỏi của em rất hay, tuy nhiên, câu hỏi chưa đúng, a hiểu ý của em. Trước khi "chém gió", có 1 số quy tắc em cần biết: Đối với con trỏ, có new, mới có delete; Có malloc, mới có free.
      Khi delete hoặc free thì con trỏ mang giá trị không xác định. Còn vùng nhớ mà con trỏ quản lí thì vẫn còn y nguyên trên bộ nhớ.
      Từ mô tả của em, a liên tửởng tới đoạn code dưới. Và chương trình đó bị lỗi, vì đã nói phía trên, không có new mà dám delete thì lỗi. Do vậy, đoạn code dưới mình không bàn.
      Code:
      #include<stdio.h>
      int main()
      {
      	int *p;
      	int a=6;
      	p=&a;
      	delete p; // error here
      	return 0;
      }
      Từ ý tưởng của em, a liên tưởng tới đoạn code khác. Và a nghĩ đây mới là cái em hỏi:
      Code:
      #include<stdio.h>
      int main()
      {
      	int *p; //1
              p=new int; //2
      	*p=6; //3
      	delete p; //4
      	return 0; //5
      }
      Quy ước: vùng nhớ cấp phát cho p có địa chỉ là 69, kích thước con trỏ là 2 byte, kích thứớc biến int là 4 byte.
      Giải thích code:
      1: Trình biên dịch tìm 1 vùng nhớ 2byte còn trống chưa được sử dụng, đặt tên là p.
      2: Trình biên dịch tìm 1 vùng nhớ 4 byte còn trống chưa được sử dụng, lấy địa chỉ của vùng nhớ đó gán cho p. ( lúc này p=69, số 69 được lưu trong 2byte của p).
      3: Lưu giá trị 6 vào vùng nhớ 69.
      4: Gán giá trị cho p khác 69, p mang 1 giá trị không xác định. Vùng nhớ 69 còn nguyên.
      5: Kết thúc chương trình thành công.
      Sau khi delete p thì, chuyện gì sẽ xảy ra, cái gì thực sự được xoá?
      Trả lời: Khi delete p; thì: giá trị của p khác 69; p không còn trỏ tới vùng nhớ 69; 69 không còn do p quản lí nữa; vùng nhớ 69 vẫn còn nguyên trên bộ nhớ nhưng p không còn trỏ đến 69 nữa;..p nhiều câu khác nhau thể hiện cùng 1 ý.
      Last edited by 11520327; 06-05-2014, 02:24.

      Comment


      • #4
        Originally posted by 11520327 View Post
        Câu hỏi của em rất hay, tuy nhiên, câu hỏi chưa đúng, a hiểu ý của em. Trước khi "chém gió", có 1 số quy tắc em cần biết: Đối với con trỏ, có new, mới có delete; Có malloc, mới có free.
        Khi delete hoặc free thì con trỏ mang giá trị không xác định. Còn vùng nhớ mà con trỏ quản lí thì vẫn còn y nguyên trên bộ nhớ.
        Từ mô tả của em, a liên tửởng tới đoạn code dưới. Và chương trình đó bị lỗi, vì đã nói phía trên, không có new mà dám delete thì lỗi. Do vậy, đoạn code dưới mình không bàn.
        Code:
        #include<stdio.h>
        int main()
        {
        	int *p;
        	int a=6;
        	p=&a;
        	delete p; // error here
        	return 0;
        }
        Từ ý tưởng của em, a liên tưởng tới đoạn code khác. Và a nghĩ đây mới là cái em hỏi:
        Code:
        #include<stdio.h>
        int main()
        {
        	int *p; //1
                p=new int; //2
        	*p=6; //3
        	delete p; //4
        	return 0; //5
        }
        Quy ước: vùng nhớ cấp phát cho p có địa chỉ là 69, kích thước con trỏ là 2 byte, kích thứớc biến int là 4 byte.
        Giải thích code:
        1: Trình biên dịch tìm 1 vùng nhớ 2byte còn trống chưa được sử dụng, đặt tên là p.
        2: Trình biên dịch tìm 1 vùng nhớ 4 byte còn trống chưa được sử dụng, lấy địa chỉ của vùng nhớ đó gán cho p. ( lúc này p=69, số 69 được lưu trong 2byte của p).
        3: Lưu giá trị 6 vào vùng nhớ 69.
        4: Gán giá trị cho p khác 69, p mang 1 giá trị không xác định. Vùng nhớ 69 còn nguyên.
        5: Kết thúc chương trình thành công.
        Sau khi delete p thì, chuyện gì sẽ xảy ra, cái gì thực sự được xoá?
        Trả lời: Khi delete p; thì: giá trị của p khác 69; p không còn trỏ tới vùng nhớ 69; 69 không còn do p quản lí nữa; vùng nhớ 69 vẫn còn nguyên trên bộ nhớ nhưng p không còn trỏ đến 69 nữa;..p nhiều câu khác nhau thể hiện cùng 1 ý.
        thực ra cái new-delete ,malloc -free e biết rùi nhưng viết cho nhanh

        Comment


        • #5
          Câu trả lời của bạn Cương ở #2 là tương đối chính xác rồi đó. Nhưng cần chỉnh lý lại 1 tí là Quyền sử dụng ô nhớ của CHƯƠNG TRÌNH bị mất chứ không phải của con trỏ đó bị mất. Quyền sử dụng ô nhớ cấp cho chương trình chứ không phải con trỏ, ô nhớ cấp xong thì con trỏ nào truy cập và sử dụng cũng được hết"

          4: Gán giá trị cho p khác 69, p mang 1 giá trị không xác định. Vùng nhớ 69 còn nguyên.
          5: Kết thúc chương trình thành công.
          Sau khi delete p thì, chuyện gì sẽ xảy ra, cái gì thực sự được xoá?
          Trả lời: Khi delete p; thì: giá trị của p khác 69; p không còn trỏ tới vùng nhớ 69; 69 không còn do p quản lí nữa; vùng nhớ 69 vẫn còn nguyên trên bộ nhớ nhưng p không còn trỏ đến 69 nữa;..p nhiều câu khác nhau thể hiện cùng 1 ý.
          Em test chưa vậy? Tui test ra khác hoàn toàn những gì em ghi.
          Cho đoạn code sau:
          Code:
          int main(){
          
              int *p = new int ;
              *p = 3;
          
              printf("*p = %d\n", *p);
              printf("p = %d\n", p);
              delete p;
              printf("p = %d\n", p);
          }
          Kết quả in ra màn hình
          Code:
          *p = 3
          p = 27107344
          p = 27107344
          Sau khi delete thì giá trị của p có thay đổi tí nào đâu!?
          Last edited by truonganpn; 06-05-2014, 21:02.

          Comment


          • #6
            Originally posted by truonganpn View Post
            Em test chưa vậy? Tui test ra khác hoàn toàn những gì em ghi.
            Cho đoạn code sau:
            Code:
            int main(){
            
                int *p = new int ;
                *p = 3;
            
                printf("*p = %d\n", *p);
                printf("p = %d\n", p);
                delete p;
                printf("p = %d\n", p);
            }
            Kết quả in ra màn hình
            Code:
            *p = 3
            p = 27107344
            p = 27107344
            Sau khi delete thì giá trị của p có thay đổi tí nào đâu!? Câu trả lời của bạn Cương ở #2 là chính xác nhất rồi đó.
            vậy là chả mất cái gì ngoài quyền sdung rồi,thế là 2 con trỏ ko dc chỉ vào 1 địa chỉ hả thầy? hình như là dc nốt mà thầy
            Last edited by 13520797; 06-05-2014, 18:33.

            Comment


            • #7
              Originally posted by 13520797 View Post
              vậy là chả mất cái gì ngoài quyền sdung rồi,thế là 2 con trỏ ko dc chỉ vào 1 địa chỉ hả thầy? hình như là dc nốt mà thầy
              cái "mà thầy" ở cuối câu là sao? Tui có nói gì được hay không được gì đâu? Em tự hỏi tự trả lời luôn rồi.

              Comment


              • #8
                Ý của thầy giải thích rõ ràng , nhưng mình muốn bổ sung tí:

                - Khi ta delete (free) con trỏ tức là giải phóng bộ nhớ mà con trỏ đang trỏ tới. Giải phóng ở đây là "Quyền sử dụng ô nhớ (vùng nhớ) của Chương Trình bị mất" hay vùng nhớ "cắt đứt" mối quan hệ với Chương Trình. Nhưng con trỏ thì vẫn trỏ đến vùng nhớ đó (bằng chứng là sau khi giải phóng thì giá trị con trỏ không đổi), giá trị vùng nhớ mà con trỏ trỏ tới tạm thời (ngay tại thời điểm vừa giải phóng) là chưa thay đổi (sau này được sử dụng lại thì có thể sẽ bị thay đổi). Lúc này vùng nhớ được giải phóng sẽ được tự do. Nhiều chương trình chạy trong máy cần vùng nhớ thì máy có thể dùng vùng nhớ trên, và dĩ nhiên Chương Trình vừa mất quyền sử dụng vùng nhớ thì cũng có thể sử dụng lại vùng nhớ này (hên xui).

                - Do con trỏ vẫn trỏ đến vùng nhớ sau khi giải phóng nên trong một số chương trình, sau khi delete (free) con trỏ, người ta thường gán con trỏ = NULL (con trỏ không trỏ đến đâu cả,"cắt đứt" mối quan hệ giữa con trỏ và vùng nhớ mà lúc trước nó trỏ).

                P/s: Bạn tham khảo thêm bài này
                Last edited by tara95; 07-05-2014, 22:20.
                I don't know the secret to success, but the secret to failure is trying to please everyone

                Comment


                • #9
                  thầy ơi em test nó lại kết quả khác hoàn toàn:
                  *p=3
                  p=00F40B70
                  P=00008123

                  đại loại là sau khi delete p thì ra kết quả khác p;

                  Comment


                  • #10
                    theo em thấy thì khi mà delete p thì giá trị của con trỏ là hoàn toàn khác:
                    vd:
                    void main()
                    {
                    int *p = new int;
                    cout << p << endl;
                    cout << p << endl;
                    delete p;
                    cout << p << endl;
                    system("pause");
                    }
                    lúc chưa delete thì p có giá trị là:011D2C60
                    nhưng sau khi delete p thì p có giá trị là:00008123
                    ->giá trị con trỏ p trước khi delete và sau khi delete là hoàn toàn khác nhau.
                    nhưng khi em đọc tài liệu thì họ lại nói là giá trị con trỏ ko thay đổi????

                    Comment


                    • #11
                      Originally posted by 12520703 View Post
                      thầy ơi em test nó lại kết quả khác hoàn toàn:
                      *p=3
                      p=00F40B70
                      P=00008123

                      đại loại là sau khi delete p thì ra kết quả khác p;
                      Code dùng để test tôi đã cho không thể in ra số ở dạng thập lục phân như vậy được. Còn code em cung cấp ở dưới không thể in ra kết quả như em ghi. Test của em không rõ ràng.

                      Comment

                      LHQC

                      Collapse
                      Working...
                      X