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

Đề tài: Giải phóng dung lượng ram do cấp phát động

  1. #1
    Ngày gia nhập
    05 2013
    Bài viết
    15

    Question Giải phóng dung lượng ram do cấp phát động

    Xin chào các Bro .
    em có câu hỏi xin nhờ mọi người giải đáp giúp.
    Em code 1 chương trình cấp phát động đại loại như sau
    int test( int valA )()
    {
    int *buff = new int;
    buff = gangiatri;

    return buff;

    }
    int main(){
    for (int i = 0 ; i <= 100;i++){
    test(i);
    }

    return 0;
    }

    cho em hỏi việc thực hiện như vậy không giải phóng biến buff trong cấp phát động nó có làm tăng bộ nhớ khi mối lần gọi đến hàm test vì việc cấp phát biến này hay không.
    Cách giải quyết là như thế nào. vì bắt buộc hàm test phải trả về pointer buff. em nghĩ đến việc gán cho biến khác bằng point buff xong xóa buff đi. nhưng chưa có cách nào khả thi

    Nhờ các cao thủ giải quyết giúp vấn đề này giúp em ạ.
    Xin cảm ơn các Bro

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    532

    Code của bạn rất khó hiểu và có lẽ là code sai. Hãy cho ví dụ khác thực tế hơn để minh họa vấn đề của bạn.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #3
    Ngày gia nhập
    05 2013
    Bài viết
    15

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Code của bạn rất khó hiểu và có lẽ là code sai. Hãy cho ví dụ khác thực tế hơn để minh họa vấn đề của bạn.
    đây là ví dụ bro. đại loại code là hàm main gọi 1 hàm con có cấp phát động 1 biến . tuy nhiên biến con trỏ đấy được trả về để hàm main sử dụng .
    Để viết lại Code như sau:
    int test(int valTest){
    int *Ktra = new int;//Tien hanh cap phat dong cho bien con tro Ktra
    int checkB = valTest;
    Ktra = &chẹckB;
    return Ktra;
    }
    int main(){

    //Dùng 1 vòng lặp nào đó cho giá trị tăng lên.
    for (int i = 0 ;i<=2000;i++){
    int *LoadB = test(i);
    }


    }

    đại loại thế này. vì code này không phải code chính . chỉ là 1 chương trình mô tả thôi ạ.

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    872

    Mã mô tả cũng vẫn sai, con trỏ không đồng nhất với số nguyên.

    không giải phóng biến buff trong cấp phát động nó có làm tăng bộ nhớ ? đương nhiên là có chỉ là mức độ ảnh hưởng tới chương trình ntn thôi, vài lần cấp phát nho nhỏ thì không là gì với năng lực của hệ thống nên không cảm nhận được còn cấp phát lớn và liên tục thì ... tèo.

    Nên ghi nhớ : có malloc thì phải có free, có new thì có delete

    Xem thêm
    C++ Code:
    1. #include<iostream>
    2.  
    3. int * ReturnIntPtr(int iValue)
    4. {
    5.     int * intPtr = 0;
    6.     if (iValue > 0)
    7.     {
    8.         intPtr = new int[iValue];
    9.         for (int i = 0; i < iValue; i++)
    10.             intPtr[i] = i;
    11.     }
    12.     return intPtr;
    13. }
    14.  
    15. int main()
    16. {
    17.     std::cout << std::endl;
    18.     // Dùng 1 vòng lặp nào đó cho giá trị tăng lên.
    19.     for (int i = 0; i <= 10; i++)
    20.     {
    21.         int * intPtr = ReturnIntPtr(i);
    22.         if (intPtr)
    23.         {
    24.             std::cout << " Created pointer to " << intPtr << " is IntArray [ ";
    25.             for (int j = 0; j < i; j++)
    26.                 std::cout << intPtr[j] << ((j < i - 1) ? "," : " ]");
    27.             std::cout << std::endl;
    28.             delete[] intPtr;
    29.             std::cout << " Deleted pointer" << std::endl;
    30.         }
    31.     }
    32.  
    33.     std::cout << std::endl;
    34.     std::cout << " ";
    35.  
    36.     system("pause");
    37.     return 0;
    38. }

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		ex.jpg
Lần xem:	3
Size:		82.1 KB
ID:		66467

    Nếu hệ điều hành đủ nhanh, nó có thể cấp phát mới ngay nơi chương trình vừa dùng lệnh delete như một số địa chỉ ở trên

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    532

    Trích dẫn Nguyên bản được gửi bởi dinhvan115 Xem bài viết
    đây là ví dụ bro. đại loại code là hàm main gọi 1 hàm con có cấp phát động 1 biến . tuy nhiên biến con trỏ đấy được trả về để hàm main sử dụng .
    Để viết lại Code như sau:
    int test(int valTest){
    int *Ktra = new int;//Tien hanh cap phat dong cho bien con tro Ktra
    int checkB = valTest;
    Ktra = &chẹckB;
    return Ktra;
    }
    int main(){

    //Dùng 1 vòng lặp nào đó cho giá trị tăng lên.
    for (int i = 0 ;i<=2000;i++){
    int *LoadB = test(i);
    }


    }

    đại loại thế này. vì code này không phải code chính . chỉ là 1 chương trình mô tả thôi ạ.
    Code này chả khác gì code #1. Không thực tế hơn chút nào.

    Vậy, mình chỉ nói lý thuyết. Con trỏ Ktra được gán trị hai lần. Lần đầu trỏ vào vùng nhớ cấp phát động nào đó, tạm gọi là checkA. Lần sau trỏ vào checkB, vốn lại là 1 vùng nhớ cấp phát trên stack. Code này có 2 chỗ sai tiềm năng:

    1) Thất thoát bộ nhớ (memory leak). Ngay khi Ktra được gán lần thứ hai, không còn con trỏ nào mang địa chỉ của checkA nữa cả, nghĩa là vùng nhớ checkA đã bị thất thoát. Đây là lỗi nhẹ.

    2) Trỏ vào mông lung (dangling pointer). Ngay khi return từ test(), checkB không còn tồn tại nữa, và địa chỉ của nó trở thành vô nghĩa. Nói cách khác, giá trị return của test() và giá trị của mọi biến được gán từ ấy, cụ thể LoadB, đều là mông lung. Lỗi này rất nặng.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

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