2012-04-11 31 views
7

Dưới đây là một số mã ví dụ:Có chuyển vùng chứa bằng trình vòng lặp không hợp lệ giá trị không?

#include <iostream> 
#include <vector> 

template <typename T> 
std::vector<typename T::iterator> f(T t) 
{ 
     std::vector<typename T::iterator> v; 
     for (auto i = t.begin(); i != t.end(); ++i) 
     { 
       v.push_back(i); 
     } 
     return v; 
} 

template <typename T> 
void print(const std::vector<T>& v) 
{ 
     for (auto i = v.begin(); i != v.end(); ++i) 
     { 
       std::cout << **i << ' '; 
     } 
     std::cout << std::endl; 
} 

int main() 
{ 
     std::vector<int> v{1, 2, 3}; 
     print(f(v)); 
     std::vector<std::vector<int>::iterator> itervec = f(v); 
     print(itervec); 
} 

On ideone đầu ra là:

1 2 3 
163487776 2 3 

Câu hỏi

Nếu tôi thay đổi f(T t)-f(T& t) đầu ra là như mong đợi. Tôi giả định bởi vì tôi đang làm việc với các bản sao của các thùng chứa, về mặt kỹ thuật các trình vòng lặp mà tôi đang đẩy trở lại trên vectơ không giống như vectơ mà tôi đã tạo ra trong chính. Điều này có đúng không? Điều tôi nhận thấy là print(f(v)); in 1 2 3 như mong đợi nhưng ngay sau khi tôi gán cho itervec trình lặp đầu tiên trở thành rác, việc này có thực hiện tất cả phụ thuộc không?

Trả lời

8

Vâng, lặp là lặp chỉ có giá trị cho đối tượng địa phương v trong hàm f, và vào cuối f, v đi ra khỏi phạm vi và bị phá hủy, và vòng lặp không hợp lệ.

Bạn phải chuyển véc-tơ theo tham chiếu (hoặc con trỏ hoặc bất kỳ thứ gì) để các trình vòng lặp bạn lưu trữ là các trình vòng lặp cho đối tượng gốc mà người gọi đi vào, không cho bản sao tạm thời được lưu trữ trong biến cục bộ.

Hành vi bạn nhìn thấy không xác định, vì vậy nó chỉ xảy ra để in ba chữ cái đầu tiên và cuối cùng hai cách chính xác.

3

Có, vì bạn đang nhận tạm thời và trả về một trình lặp của tạm thời đó. Sau khi thoát khỏi hàm, tạm thời bị xóa, làm mất hiệu lực trình lặp.

Nếu bạn tuy nhiên nhận được thông tin tham chiếu cả mainprint đang truy cập cùng một đối tượng. Vì đối tượng này vẫn tồn tại sau khi thoát khỏi hàm, trình vòng lặp không bị vô hiệu.

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