Проблема здесь только в том, что во времена, когда космические корабли бороздят просторы C++17 и уже подлетают к системе C++20, вы занимаетесь ручным управлением памятью.
Что переменная tab, что arrayFromFunction, обе они имеют тип int*. Да, такой указатель может указывать как на скалярное значение, так и на массив оных. Именно поэтому и возможны вообще ошибки неправильного использования delete / delete[]. При освобождении памяти всегда надо знать, что лежит по указанному адресу. В вашем случае по адресу всегда размещается массив (выделен через new[]), стало быть и удалять его надо через delete[], а не delete. Иначе схватите неопределённое поведение.
По вашему коду представьте, что функция просто вставилась (inline) в место вызова (перестала существовать как вызываемая функция), тогда:
int* arrayFromFunction = getArray();
std::cout << arrayFromFunction[0];
delete [] arrayFromFunction;
превратится в:
int* arrayFromFunction = new int[30];
std::cout << arrayFromFunction[0];
delete [] arrayFromFunction;
Здесь, я думаю, у вас уже не возникает вопроса в валидности кода. Фактически эти куски кода дают идентичный результат.
Но вот если бы ваша функция getArray превратилась в нечто такое:
int* getSome(bool c)
{
if (c) {
int* tab = new int[30];
return tab;
}
return new int(42);
}
То в зависимости от условия c возвращался бы либо массив, либо одиночное число. И для всего этого пришлось бы ставить в соответствие правильный вызов delete или delete[], чтобы программа оставалась корректной.
delete[]. "функция вернёт не массив, а указатель на него" А при чем тут функция?tabостается указателем (не массивом) даже если не возвращать его изgetArray. – HolyBlackCat Dec 27 '19 at 17:19int, а не на массив. Но этот факт мне нисколько не позволяет понять, как сработает к немуdelete[]– Александр Dec 27 '19 at 17:42int* tab = new int[30];, это все равно 'указатель на тип int'. Указатель с типом "указатель на массив" выглядел бы так:int (*tab)[N];. – HolyBlackCat Dec 27 '19 at 17:50new[], освободили с помощьюdelete[], все в рамках одного менеджера памяти - так что тут все нормально. – Harry Dec 27 '19 at 18:02c++ввиду умных указателей, но вси... – Eikthyrnir Dec 27 '19 at 19:04malloc– Eikthyrnir Dec 27 '19 at 19:28new_some<->free_some, но никак мне вызовdelete/freeв приложении которое получило этот указатель на массив, или объект. – Dec 27 '19 at 22:14