Следующий код использует кучу:Можно ли вернуть VLA?
char* getResult(int length) {
char* result = new char[length];
// Fill result...
return result;
}
int main(void) {
char* result = getResult(100);
// Do something...
delete result;
}
Так result
должен быть удален где-то, предпочтительно владельцем.
ниже код, от того, что я понимаю, использовать расширение под названием VLA, который является частью C99, а не часть стандарта C++ (но поддерживаются GCC и другие компиляторы):
char* getResult(int length) {
char result[length];
// Fill result...
return result;
}
int main(void) {
char* result = getResult(100);
// Do something...
}
Правильно ли я полагаю, что result
по-прежнему выделяется в стеке в этом случае?
Является ли result
копией, или это ссылка на память для мусора? Является ли вышеуказанный код безопасным?
VLA - это красная сельдь. Вы возвращаете адрес переменной, выходящей из области действия, периода. –
@KerrekSB Я не хочу быть придирчивым, но масштабы и продолжительность жизни - это разные понятия. Когда вы вызываете функцию, переменная, объявленная в области блока, также выходит за пределы области видимости, но ее время жизни не заканчивается. – ouah
@ouah: Да, true: «Переменная, чья жизнь заканчивается, поскольку она выходит из сферы действия», я должен был сказать. –