2
Rò rỉ bộ nhớ trong lập trình là gì?
1
2
Vương60 đã đăng:

Rò rỉ bộ nhớ (Memory leak) là bộ nhớ được cấp phát cho các đối tượng, biến, hàm, ... có trong mã nguồn khi mã nguồn đang chạy nhưng không bao giờ được giải phóng sau khi mã nguồn đã chạy xong.

Thuật ngữ rò rỉ bộ nhớ được sử dụng nhiều trong ngành khoa học máy tính và phần mềm nói chung nói về việc lập trình viên quản lý vùng nhớ không hiệu quả dẫn đến phung phí bộ nhớ của hệ điều hành khi chương trình bắt đầu chạy.

Nếu chương trình có lỗi rò rỉ bộ nhớ được chạy trong thời gian dài, tức là bộ nhớ của hệ điều hành được cấp phát liên tục mà không được giải phóng để cung ứng lại hoặc điều tiết bộ nhớ cho các hoạt động của chương trình khác, dẫn đến bộ nhớ có sẵn của hệ điều hành bị cạn kiệt, hệ thống chậm dần chậm dần và cuối cùng treo máy là điều tất yếu.

Do đó, phần mềm có lỗi rò rỉ bộ nhớ mà được sử dụng trong hệ thống máy chủ web, game, ứng dụng, ... (là những hệ thống máy chủ thường phải hoạt động 24/24 trong thời gian dài) thì vô cùng nguy hiểm, đến một thời điểm nào đó, máy chủ sẽ bị trì truệ và sập. Cách giải quyết tạm thời trong trường hợp này là khởi động lại hệ điều hành nhưng hãy chắc chắn bạn phải tìm ra nguyên nhân, nếu không tình trạng sẽ lại tiếp diễn.

Một ví dụ đơn giản về rò rỉ bộ nhớ trong ngôn ngữ lập trình C++ như sau,

#include <iostream>
using namespace std;

int main(){
    /* khởi tạo và cấp phát cùng nhớ cho con trỏ A*/
    int *A = new int[30];

    /* làm gì đó với con trỏ A */

    /* giải phóng vùng nhớ đã cấp phát cho con trỏ A*/
    //delete [] A;
}

Con trỏ A sau khi gọi từ khóa new sẽ được hệ điều hành cấp phát 30 x 4 = 120 bytes trong bộ nhớ RAM (1 int = 4 bytes), giả sử sau khi làm gì đó với con trỏ A xong, bạn quên sử dụng câu lệnh delete [] A tức là bạn đã quên giải phóng vùng nhớ đã được cấp phát cho con trỏ A, đó gọi là lỗi rò rỉ bộ nhớ.

Ví dụ trên khá đơn giản cho nên không gây cạn kiệt bộ nhớ máy tính của bạn đâu nhé ^^, hy vọng sẽ trả lời được câu hỏi của bạn.

đã bổ sung 5.6 năm trước bởi
Avatar: Vương Vương60
thêm bình luận...
1
huythong20 đã đăng:

Trường hợp các đối tượng, biến, hàm, ..v.v. được khởi tạo trong chương trình mà không được sử dụng cũng được xem là rò rỉ bộ nhớ bởi vì nó cũng gây lãng phí tài nguyên của máy tính.

Trường hợp này xảy ra rất phổ biến đặc biệt đối với các bạn mới lập trình, thường hay viết thêm mã nguồn để kiểm tra mà quên xem xét lại mã nguồn để xóa những phần dư thừa không cần thiết.

#include <stdio.h>

int main()
{
    int a = 7;
    float b = 3.4, c = 3.2, d = 5.6;// Đoạn mã nguồn này được khởi tạo
                                                // mà không sử dụng gây lãng phí
                                                // tài nguyên máy tính
    int e = 3;

    printf("%d\n", a + e);

    return 0;
}
2

That's right... nhưng mình nghĩ nó rơi vào trường hợp rò rỉ không gian nhớ (Space leak) hơn là rò rỉ bộ nhớ, nếu lấy theo ví dụ của bạn, mặc dù biến b, c, d không được sử dụng nhưng khi kết thúc chương trình nó cũng sẽ được giải phóng, chỉ là trong khi chương trình đang chạy, nó được cấp phát không gian nhớ một cách vô ích làm tốn không gian nhớ mà thôi.

Vương 05.08.2018

Thuyết phục, cảm ơn bạn đã bổ sung.

huythong 05.08.2018
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)