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