void f( int *p )
{
p = new int( 10 );
}
void g( int * &p )
{
p = new int( 10 );
}
和他们的挑战
int main()
{
int *p = nullptr;
f( p );
if ( p == nullptr ) std::cout << "p is equal to nullptr" << std::endl;
else std::cout << "p is not equal to nullptr" << std::endl;
g( p );
if ( p == nullptr ) std::cout << "p is equal to nullptr" << std::endl;
else std::cout << "p is not equal to nullptr" << std::endl;
delete p;
}
如果你有一个用参数声明的函数,比如
其中
T是某种类型,调用此函数时将一些表达式作为参数传递给它,例如那么参数的初始化可以表示如下
也就是说,参数是函数的局部变量,由作为参数传递给函数的表达式进行初始化。因此,参数更改对原始参数没有影响,除非类型
T是引用类型。比较两个函数
和他们的挑战
在这个例子中,
f调用函数时发生了内存泄漏,因为函数中分配的内存没有被释放。函数参数——一个局部变量p——在函数退出时被删除,因此动态分配内存的地址将丢失。函数
g参数有一个引用类型,即 this 对传递给函数的参数的引用。因此,该函数处理原始参数并在其主体中对其进行更改,为其提供已分配内存的地址。如果要更改函数中的原始指针,也可以将指针传递给指针。例如,
函数调用看起来像
创建。
在函数内部,您可以为指针分配不同的值而不影响外部变量。
工作示例。