Указатель как ярлык или гиперссылка. Создание только ярлыка не устанавливает программу. Создание гиперссылки не волшебным образом настраивает весь сайт.
То же, что и указатель: a int*
- это указатель на целое число. Это не целое число. Таким образом, вы должны убедиться, что указатель указывает на что-то значимое, прежде чем пытаться следовать указателю.
Один из способов сделать так, чтобы создать целое и наборы указатель, чтобы указать на него:
int* ret_val = new int;
Это создаст целое число (new
оператора), а затем устанавливает ret_val
указатель на точку к нему.
Объекты, созданные через new
, существуют до тех пор, пока вы явно не уничтожите их через delete
или когда ваше приложение закончится. По этой причине, если у вас есть функция new int
, она безопасна для ее доступа, даже если функция завершается.
Что бы dangereous, и, вероятно, вызвано ваше беспокойство, если вы бы установить указатель ret_val
не новое целое, но к существующей локальной переменной, т.е.
int myInteger;
int* ret_val = &myInteger;
В таком сценарии, ret_val
точки к локальной переменной myInteger
, которая уничтожается, когда заканчивается область, содержащая объявление. Вы попадаете в висячий указатель, ссылаясь на то, что не существует (подумайте: сломанная гиперссылка). Использование такого указателя может привести к неопределенному поведению.Это может привести к сбою вашей программы, но она может также молча принять ее, модифицируя случайное пространство в памяти.
Таким образом, функция формы:
int* foo(void)
{
int* ret_val = new int;
*ret_val = 1234;
return ret_val;
}
является безопасным для использования. Это не обязательно хорошая практика: пользователь такой функции должен знать, что она создает новое целое число, которое позже - в какой-то момент - кому-то должно быть delete
. Функции, которые делают это, как правило, выделяют такое поведение каким-либо образом, например. через его название. Например, allocateInt()
дает понять, что он создал то, что позже должно быть удалено. Напротив, getInt()
предполагает, что целое число уже существует и ничего не создано.
Вы не выделили какую-либо память для возврата! Так что это плохая практика. Однако, если бы вы использовали 'malloc()' для распределения памяти, тогда, поскольку память malloc может использоваться между вызовами функций, тогда это не было бы плохой практикой. – Haris
'* ret_val = 1234;' плохой сам по себе. Что касается вопроса, если вы не используете 'new', то это обман http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its- scope – NathanOliver
Да, для возвращения динамически выделенного объекта является плохой практикой, так как сложнее отслеживать возможные утечки памяти. – meJustAndrew