Đây không phải là một câu hỏi về lý do tại sao bạn sẽ viết mã như thế này, nhưng nhiều hơn như là một câu hỏi về cách một phương thức được thực hiện liên quan đến đối tượng mà nó được gắn với.Điều gì sẽ xảy ra nếu một đối tượng thay đổi kích cỡ vùng chứa của chính nó?
Nếu tôi có một cấu trúc như:
struct F
{
// some member variables
void doSomething(std::vector<F>& vec)
{
// do some stuff
vec.push_back(F());
// do some more stuff
}
}
Và tôi sử dụng nó như thế này:
std::vector<F>(10) vec;
vec[0].doSomething(vec);
Điều gì xảy ra nếu push_back(...)
trong doSomething(...)
gây vector để mở rộng? Điều này có nghĩa là vec[0]
sẽ được sao chép rồi xóa ở giữa khi thực hiện phương thức của nó. Điều này sẽ không tốt.
Ai đó có thể giải thích chính xác điều gì xảy ra ở đây?
- Chương trình có bị lỗi ngay lập tức không? Liệu phương pháp chỉ cố gắng hoạt động trên dữ liệu không tồn tại?
- Phương thức này có hoạt động "mồ côi" đối tượng của nó cho đến khi nó gặp sự cố như thay đổi trạng thái của đối tượng không?
Tôi quan tâm đến cách gọi phương thức có liên quan đến đối tượng được liên kết.
Cảm ơn câu trả lời. Bạn có nói rằng nó có khả năng chương trình có thể tiếp tục mà không bị rơi? Nếu tôi viết quá giới hạn của một mảng vào bộ nhớ trống, nó sẽ được phát hiện. Điều gì sẽ cho phép một phương pháp có thể viết vào bộ nhớ miễn phí mà không có vấn đề? – user487100
Bạn hầu như luôn có thể ghi vào bộ nhớ "giải phóng" mà không gặp sự cố. Đó là cách hoạt động của ánh xạ bộ nhớ. Bản đồ vẫn được sử dụng cho các đối tượng trong tương lai. Bạn có thể ** không bao giờ ** viết vào bộ nhớ giải phóng "mà không có vấn đề", tuy nhiên. Nó chỉ là "vấn đề" là những thứ khác hơn là đâm. –
@ user487100: Nếu bạn viết quá giới hạn của một mảng vào bộ nhớ trống, nó được phát hiện _sometimes_. Nó khá dễ dàng để tạo ra một trường hợp mà tôi có thể viết qua kết thúc và không có nó phát hiện trong một thời gian. Phân bổ một 'char * a = new char [1]', và sau đó đọc và ghi vào 'a [1]', nó có thể sẽ không kích hoạt bất kỳ lỗi nào trên hầu hết các hệ thống. –