Хорошо, я думаю, мы все согласны с тем, что происходит со следующим кодом: undefined, в зависимости от того, что передано,
void deleteForMe(int* pointer)
{
delete[] pointer;
}
Указатель может быть разным, и поэтому выполнение безусловного delete[]
на нем undefined. Однако предположим, что мы действительно передаем указатель массива,
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;
}
ОС достаточно умна, чтобы удалять только один int и не использовать какой-либо тип "убийства", удаляя остальную память за пределами этой точки (контраст, который с strlen
и не-t27 > -термирован string - он будет продолжаться до тех пор, пока он не достигнет 0).
Итак, чья задача - запомнить эти вещи? Поддерживает ли ОС запись какого-либо типа в фоновом режиме? (Я имею в виду, я понимаю, что я начал этот пост, сказав, что происходит undefined, но факт в том, что сценарий "killing spree" не происходит, поэтому в практическом мире кто-то помнит.)