Tôi dường như không thể tìm thấy nhiều thông tin về việc liệu trình vòng lặp có giữ lại đối tượng bên dưới mà chúng đang lặp lại hay không.Trình lặp C++ có giữ tham chiếu đến đối tượng bên dưới không?
Nếu tôi tạo trình lặp, thì đối tượng cung cấp nó vượt quá phạm vi, sự hiện diện của trình vòng lặp có ngăn không cho nó bị hủy không?
Dưới đây là một ví dụ rất đơn giản chỉ để minh họa cho kịch bản:
// This class takes a copy of iterators to use them later
class Data {
public:
Data(std::vector<int>::iterator start, std::vector<int>::iterator end)
: start(start),
end(end)
{}
void show() {
// Use this->start and this->end for some purpose
}
private:
std::vector<int>::iterator start;
std::vector<int>::iterator end;
};
Data test() {
std::vector<int> v{1, 2, 3};
Data d(v.begin(), v.end());
d.show(); // this would be ok
return d;
}
int main(void) {
Data d = test();
d.show(); // What happens here?
}
Trong ví dụ này, các đối tượng Data
được lưu trữ một bản sao của vòng lặp, mà là tốt cho show()
cuộc gọi đầu tiên. Tuy nhiên vào thời điểm cuộc gọi show()
thứ hai, đối tượng gốc cung cấp các trình vòng lặp không còn tồn tại nữa.
Các trình vòng lặp có giữ đối tượng xung quanh cho đến khi chúng bị phá hủy hoặc các trình vòng lặp không hợp lệ ngay khi đối tượng ban đầu nằm ngoài phạm vi?
Đây là one reference of many mà không nói những gì xảy ra cách này hay cách khác (hoặc thậm chí cho dù kết quả của việc này là 'undefined').
Bộ lặp được mô phỏng hóa trên con trỏ. Nói chung, nếu một con trỏ không thể làm điều X cấp cao, thì không thể lặp lại. –
Có, trình lặp sẽ bị vô hiệu, kết quả là không xác định. – songyuanyao
Để giải quyết tình huống cụ thể của bạn: phá hủy một thùng chứa sẽ vô hiệu hóa tất cả các trình vòng lặp vào nó. –