2012-12-20 40 views
7

thể trùng lặp:
Returning the address of local or temporary variable
Can a local variable’s memory be accessed outside its scope?trở về tham chiếu đến các biến cục bộ

Thậm chí biết những gì sẽ xảy ra như là kết quả của sau Snips nó sẽ rất hữu ích để hiểu làm thế nào nó đang xảy ra . Bốn câu hỏi tiếp theo.

Given:

int& foo() 
{ 
    int i = 1; 
    return i; 
} 

Và khi biết rằng trong những điều sau một tham chiếu đến địa phương tên là i là de-tham chiếu vào một temp được gán cho intval và địa phương i biến mất vào cuối foo()

int intVal = foo(); 

câu hỏi đầu tiên - trong những điều sau đây, phía bên tay phải của biểu thức là tương tự như trên như vậy là đây là một trường hợp trình biên dịch nhìn thấy phía bên tay trái và, dựa trên ngữ cảnh, không biết để không tham khảo tham chiếu trả về, và thay vào đó để tạo một tham chiếu mới được khởi tạo với nó?

Câu hỏi thứ hai - và điều này một mình làm cho các số nội bộ i được gắn xung quanh trong khi intRef nằm trong phạm vi?

int& intRef = foo(); 

Thứ ba câu hỏi - dưới IntPtr được địa chỉ của địa phương i. Vì vậy, là trình biên dịch sử dụng bối cảnh của nhiệm vụ và quyết định không de-tham chiếu để có được một giá trị trước khi lấy địa chỉ của tài liệu tham khảo (thay vì nói lấy địa chỉ của một temp chứa giá trị de-tham chiếu)?

Câu hỏi thứ tư - không địa phương i dán xung quanh trong khi intPtr nằm trong phạm vi?

int* intPtr = &foo(); 
+2

Thật vô nghĩa khi biết điều gì xảy ra ở đây. FWIW, nó * không bao giờ * dính xung quanh, và trong lần đầu tiên nó không dính xung quanh đủ dài cho bất cứ điều gì xảy ra. –

+0

Không có "tạm thời"! –

+0

có thể trùng lặp: [Trả lại địa chỉ biến cục bộ hoặc tạm thời] (http://stackoverflow.com/q/2744264/187543) – cpx

Trả lời

6

Không, không ai trong số đó sẽ kéo dài tuổi thọ của biến cục bộ. Không có gì trong C++ sẽ có hiệu ứng đó. Các đối tượng địa phương trong C++ sống cho đến cuối phạm vi mà chúng được khai báo, kết thúc câu chuyện.

Nguyên tắc duy nhất, ở cái nhìn đầu tiên, dường như tuân theo quy tắc khác nhau là thế này:

int foo() { 
    return 42; 
} 

int main() { 
    const int& i = foo(); 
    // here, `i` is a reference to the temporary that was returned from `foo`, and whose lifetime has been extended 
} 

Nghĩa là, một const tài liệu tham khảo có thể kéo dài tuổi thọ của một tạm được gán cho nó.

Nhưng điều đó yêu cầu hàm trả về giá trị, không phải tham chiếu và mức độ thoải mái để ràng buộc giá trị trả về tham chiếu const, không được thực hiện trong mã của bạn.

+0

"yêu cầu hàm trả về một giá trị, không phải là tham chiếu" <- bạn nên viết điều này bằng chữ hoa, với phông chữ đậm! :) –

0

Trong mọi trường hợp (không phải intVal, không intRef và không phải là intPtr) thì i nhất thiết phải nằm xung quanh sau khi foo trả về.

Giá trị trên ngăn xếp mà trước đó đã bị i chiếm đóng có thể hoặc không thể thay đổi bất kỳ lúc nào, sau khi foo trả về.

Ví dụ (trên một số CPU và O/Ses), nó có thể bị thay đổi bởi bất kỳ cuộc gọi tiếp theo nào đến chương trình con, và có thể thay đổi nếu xảy ra ngắt phần cứng.

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