Được rồi, tôi nghĩ tất cả chúng ta đều đồng ý rằng những gì xảy ra với đoạn mã sau là không xác định, tùy thuộc vào những gì được thông qua,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Con trỏ có thể là tất cả các loại khác nhau, và do đó thực hiện một điều kiện vô điều kiện delete[]
trên nó là không xác định. Tuy nhiên, hãy giả sử rằng chúng ta thực sự đang vượt qua một con trỏ mảng,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Câu hỏi của tôi là, trong trường hợp con trỏ là một mảng, ai là người biết điều này? Ý tôi là, từ quan điểm của ngôn ngữ / nhà biên dịch, không biết liệu có phải arr
là một con trỏ mảng so với một con trỏ đến một int không. Heck, nó thậm chí không biết liệu arr
đã được tạo ra động. Tuy nhiên, nếu tôi làm như sau thay vào đó,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
HĐH đủ thông minh để chỉ xóa một int và không thực hiện một số loại 'giết người' bằng cách xóa phần còn lại của bộ nhớ ngoài điểm đó (tương phản với strlen
và một \0
chuỗi không bị hủy - nó sẽ tiếp tục cho đến khi đạt 0).
Vì vậy, công việc của ai là ghi nhớ những điều này? Hệ điều hành có giữ một số loại bản ghi trong nền không? (Ý tôi là, tôi nhận ra rằng tôi đã bắt đầu bài đăng này bằng cách nói rằng những gì xảy ra là không xác định, nhưng thực tế là, kịch bản 'giết người' không xảy ra, vì vậy trong thế giới thực tế có ai đó đang nhớ.)