2016-07-06 31 views
9

Trong C khi tôi trả về một con trỏ của biến được tạo ngăn xếp từ một hàm, bộ nhớ loại bỏ sau khi hàm được trả về, do đó làm cho con trỏ không thể dereference. Nhưng trong Go, trình biên dịch không cho tôi bất kỳ lỗi nào. Điều đó có nghĩa là việc này có an toàn không?Go - trả về một con trỏ trên ngăn xếp

package main 

import (
    "fmt" 
) 

func main() { 
    fmt.Println(*(something())) 
} 

func something() *string { 
    s := "a" 
    return &s 
} 

Trả lời

10

Có, đây là mô hình an toàn và bình thường trong lập trình Go. Đi sử dụng escape analysis để di chuyển bất kỳ giá trị nào bằng con trỏ tự động thoát khỏi ngăn xếp đến heap. Bạn không cần phải quan tâm đến nơi các giá trị được phân bổ.

Từ Go FAQ: "How do I know whether a variable is allocated on the heap or the stack?"

nếu trình biên dịch không thể chứng minh rằng biến không được tham chiếu sau khi trở về chức năng, sau đó trình biên dịch phải phân bổ biến trên heap thu gom rác để tránh treo lủng lẳng lỗi con trỏ

Bạn có thể thấy các tùy chọn tối ưu hóa này trong quá trình biên dịch bằng cách sử dụng tùy chọn -gcflags -m.

3

Có, ở Golang, bạn có thể trả lại con trỏ về biến cục bộ. Golang sẽ quản lý các đối tượng suốt đời cho bạn và giải phóng nó khi tất cả các con trỏ đến nó biến mất.

Trong câu trả lời khác, tôi chỉ ra tất cả sự khác biệt giữa con trỏ C/C++ và con trỏ Golang: What is the meaning of '*' and '&' in Golang?

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