Это передается по значению.
void func( char * b )
{
b = new char[4];
}
int main()
{
char* buf = 0;
func( buf );
delete buf;
return 0;
}
buf все равно будет 0 после вызова func
и утечка новой памяти.
Когда вы передаете указатель по значениюВы можете изменить то, на что указывает указатель, а не на сам указатель.
Правильный способ выполнения вышеуказанных действий будет
ALTERNATIVE 1
void func( char *& b )
{
b = new char[4];
}
int main()
{
char* buf = 0;
func( buf );
delete buf;
return 0;
}
Обратите внимание, что указатель передается по ссылке, а не по значению.
ALTERNATIVE 2
Другой альтернативой является передача указателя на указатель, например
void func( char ** b )
{
*b = new char[4];
}
int main()
{
char* buf = 0;
func( &buf );
delete buf;
return 0;
}
Обратите внимание, что я никоим образом не защищаюиспользование обнаженных указателей и ручное управление памятью, как показано выше, но просто для иллюстрации проходящего указателя.C ++ может использовать вместо std::string
или std::vector<char>
.