2012-03-20 38 views
7
struct node 
{ 
    Item item; node *l, *r; 
    node(Item x) {item = x; l = 0; r = 0;} 
}; 

typedef node* link; 
link max(Item a[], int l, int r) 
{ 
    int m = (l+r)/2; 
    link x = new node(a[m]); 
    if (l==r) return x; // return a local pointer 
    x->l = max(a, l, m); 
    x-r = max(a, m+1, r); 
    Item u = x->l->item, v = x->r->item; 
    if (u>v) x->item = u; 
    else x->item=v; 

    return x; // return a local pointer 
} 

Đây là một đoạn mã từ "Thuật toán trong c + +" của Robert Sedgewick, Trang 252, Chương trình 5.19. Và trong hàm max(), biến trả về là một con trỏ được tạo bên trong hàm.trả về một con trỏ cục bộ

Theo ý kiến ​​của tôi, trả về một con trỏ cục bộ không được phép trong c/C++. Vì vậy, câu hỏi của tôi là "là OK để viết một chức năng như thế này"? Tôi không thể tin một cuốn sách kinh điển như vậy lại phạm sai lầm như thế này. Hoặc tôi hiểu lầm nguyên tắc? Xin vui lòng giúp đỡ. Cảm ơn.

+0

'link x = nút mới (a [m]);'! = Local pointer – Mysticial

+1

@Micicial: Nói theo cách nói, nó * là * một con trỏ cục bộ, nhưng nó không trỏ đến một đối tượng cục bộ :-) –

+0

Trong 'c' trả về một con trỏ đến một biến cục bộ với kết quả trong một cảnh báo, và có lẽ nên tránh trừ khi bạn biết bạn đang làm gì, nhưng nó sẽ hoạt động. Không chắc chắn là 'C++' thay đổi thành một lỗi. – twain249

Trả lời

5

x không phải là "con trỏ cục bộ" - nghĩa là một con trỏ đến biến cục bộ. *x được phân bổ sử dụng new. x điểm để phân bổ động bộ nhớ và trở về con trỏ đó là tốt. Vì vậy, có, nó là OK để viết một chức năng như thế này, và không có một lỗi trong cuốn sách.

3

Đó là lỗi khi trả về con trỏ đến biến cục bộ. x điểm cho một biến cấp phát trên heap:

link x = new node(a[m]); 

Như vậy x không trỏ đến một biến địa phương.

Lý do trả về con trỏ đến biến cục bộ là lỗi là biến đó tồn tại chỉ miễn là hàm đang hoạt động (tức là giữa hàm được nhập và thoát). Các biến được phân bổ trên heap (ví dụ: với việc sử dụng toán tử new) tồn tại cho đến khi chúng được deallocated (ví dụ: với toán tử delete).

+0

Vì vậy, bộ nhớ được phân bổ cho x sẽ không được giải phóng cho đến khi chúng tôi làm như vậy một cách rõ ràng. Hoặc tôi có thể nói bộ nhớ được cấp phát trên ngăn xếp chức năng sẽ không được xác định nếu biến đó nằm ngoài phạm vi; nhưng trên heap sẽ không? –

+0

Có. Bạn cần bố trí rõ ràng. Ngoài ra, một biến được phân bổ trên heap sẽ tiếp tục tồn tại sau khi trở về từ hàm được cấp phát. –

1

Điều này là hoàn toàn tốt, vì nội dung của x được cấp phát trên heap chứ không phải ngăn xếp. Bạn có thể bị nhầm lẫn vì có một typedef node* link; trong đó, làm cho nó trông giống như một phân bổ ngăn xếp vì nó che dấu thực tế là x thực sự là một node *.

+1

'x' là biến tự động. Có lẽ bạn đang nghĩ về '* x'. –

+0

@KerrekSB yeah Tôi cho rằng tôi có nghĩa là "nội dung của' x' được phân bổ trên heap ", chỉnh sửa cho rõ ràng. – jli

+0

Thực ra, nội dung của 'x' là nội dung của một biến tự động. Bạn có lẽ đang nghĩ về nội dung của '* x'? –

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