Chào thầy các bạn, hiện tại mình đang có 1 thắc mắc khi đọc về lỗi leak bộ nhớ trong c++ nhưng không hiểu được ví dụ mà tài liệu dẫn như sau:
void f(int n)
{
int* p1 = new int[n];
unique_ptr<int[]> p2 {new int[n]};
//...
ì(n%2) throw runtime_error("odd");
delete[] p1;
}
trong ví dụ trên, khi cho n=3 (số lẻ) thì xảy ra leak bộ nhớ ở p1, còn p2 thì không vấn đề gì.
Ai có thể giải thích giùm mình không?
[QUOTE=10520173;320707]Chào thầy các bạn, hiện tại mình đang có 1 thắc mắc khi đọc về lỗi leak bộ nhớ trong c++ nhưng không hiểu được ví dụ mà tài liệu dẫn như sau:
void f(int n)
{
int* p1 = new int[n];
unique_ptr<int[]> p2 {new int[n]};
//...
ì(n%2) throw runtime_error("odd");
delete[] p1;
}
trong ví dụ trên, khi cho n=3 (số lẻ) thì xảy ra leak bộ nhớ ở p1, còn p2 thì không vấn đề gì.
Ai có thể giải thích giùm mình không?[/QUOTE]
Thì hàm f của bạn cấp phát 1 vùng nhớ n phần tử kiểu int ( p1 )
Khi gặp n lẻ thì điều kiện if(n%2) ( Nếu n chiaw không hết cho 2 ) thì văng exception ,
như vậy đoạn code giải phóng bộ nhớ đã cấp phát cho p1 delete p1; (unreachable) không đc thực thi –> suy ra mất dấu , không thể giải phóng cho p1 đc nữa , mặc dù hết hàm f , nó đã không còn đc xài nữa.
Còn p2 không bị là bỏi vì nó là tự động quản lý, nhận biết giải phóng vùng nhớ khi không còn xài nữa ( muốn rõ cơ chế nó thì cplusplus.com đọc thêm )
