2014-05-10 13 views
5
int* alloc() 
{ 
    int* tmp = new int; 
    return tmp; 
} 

int main() 
{ 
    int* ptr = alloc(); 
    ...... 
    ...... 
    delete ptr; 
    return 0; 
} 
  1. Ở đây tôi chưa giải phóng tmp nhưng ptr được giải phóng một cách rõ ràng. Sẽ tmp cũng được giải phóng kể từ ptr và tmp tham khảo cùng một vị trí?Điều này có gây ra rò rỉ bộ nhớ trong c + + không?

  2. Nếu không thì điều gì sẽ xảy ra với con trỏ tmp? Nó có gây rò rỉ bộ nhớ không?

+1

Nó không gây rò rỉ. Con trỏ 'tmp' chính nó là một biến ngăn xếp, vì vậy nó không sử dụng bất kỳ bộ nhớ nào khi trả về' alloc() '. –

+0

Làm thế nào để tmp một biến ngăn xếp khi nó sử dụng toán tử mới? – kishore

+1

@kishore: 'ptr' chỉ giữ địa chỉ. Địa chỉ đó được lưu trữ trên ngăn xếp. Những gì nó _points to_ (tài nguyên) là ở một nơi khác, và đó là những gì bạn cần để giải phóng (tài nguyên, không phải là con trỏ). 'delete prt;' không thực sự làm _anything_ thành 'ptr'. Chỉ với những gì nó trỏ đến. – Mat

Trả lời

5

Không, điều này không gây rò rỉ bộ nhớ. Rò rỉ bộ nhớ là bộ đệm (các khối bộ nhớ) đã được cấp phát nhưng không được trả lại (khi chúng không còn được sử dụng nữa). Trong chức năng alloc() của bạn, tmp không phải là bộ đệm ... đó là biến mà sau cuộc gọi đến new, giữ địa chỉ của bộ đệm. Hàm của bạn trả về địa chỉ này, trong main(), được lưu trữ trong biến số ptr. Khi bạn gọi delete ptr, bạn đang phát hành bộ đệm rằng ptr điểm đến, do đó bộ đệm đã được phát hành và không có rò rỉ.

+0

Điều gì sẽ xảy ra khi tôi có nhiều con trỏ RAW trỏ đến cùng một vị trí bộ nhớ và miễn phí một trong những con trỏ đó? Liệu bộ nhớ có được giải phóng sau đó? – kishore

+0

@ seedore yes, bạn phải giải phóng bộ đệm của mình một cách chính xác một lần và không cần biết có bao nhiêu địa điểm (con trỏ) bạn có một bản sao địa chỉ bộ đệm. – mah

3

Chương trình của bạn sẽ không gây rò rỉ bộ nhớ miễn là không có trường hợp ngoại lệ bị ném ra.

Bạn có thể làm tốt hơn và làm cho nó 100% chống bom như thế này:

#include <memory> 

std::unique_ptr<int> alloc() 
{ 
    std::unique_ptr<int> tmp { new int }; 
    //... anything else you might want to do that might throw exceptions 
    return tmp; 
} 

int main() 
{ 
    std::unique_ptr<int> ptr = alloc(); 

    // other stuff that may or may not throw exceptions 

    // even this will fail to cause a memory leak. 
    alloc(); 
    alloc(); 
    alloc(); 

    auto another = alloc(); 

    // note that delete is unnecessary because of the wonderful magic of RAII 
    return 0; 
} 

Nhận được vào thói quen này sớm.

Các vấn đề liên quan