Хорошо, я думаю, что мы все согласны с тем, что то, что происходит со следующим кодом, не определено, в зависимости от того, что передано,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Указатель может быть разного рода, поэтому выполнение безусловного delete[]
для него не определено. Однако, давайте предположим, что мы действительно передаем указатель массива,
int main()
{
int* arr = new int[5];
deleteForMe(arr);
return 0;
}
Мой вопрос, в этом случае, когда указатель является массивом, кто это знает? Я имею в виду, с точки зрения языка / компилятора, он не имеет представления, является ли arr
указателем массива по сравнению с указателем на один тип int. Черт возьми, он даже не знает, был ли arr
создан динамически. Тем не менее, если я сделаю следующее вместо этого,
int main()
{
int* num = new int(1);
deleteForMe(num);
return 0;
}
Операционная система достаточно умна, чтобы удалять только одно целое число и не использовать какой-либо тип "убийственного веселья", удаляя остальную часть памяти после этой точки (в отличие от strlen
и не-1011 * -определенного строка - она будет продолжаться, пока не достигнет 0).
Так чья же работа - помнить эти вещи? Сохраняет ли ОС какой-либо тип записи в фоновом режиме? (Я имею в виду, я понимаю, что начал этот пост, сказав, что то, что происходит, не определено, но на самом деле сценарий «убийства» не происходит, поэтому в практическом мире кто-то помнит .)