函数可以返回地址值对不对?
答案是肯定的。函数返回地址值,在C++或者C语言应用非常普遍。典型的应用事例是定义返回指针类型的函数,使用时也有些需要注意的事项。
首先,确保返回的地址对应的内存块的有效性。换句话说,程序员要确保至某个地址在所有应用它的程序块执行之前必须有效。实际使用时大家经常犯的错误是返回局部变量的地址,如下面的伪代码所示:
int* func()
{
int iret;
return &iret;
}
func函数执行返回之后,iret对应的内存地址由于在栈上,很快就会被系统回收,地址也就随之失效。再次访问时,常常爆出非法访问的错误。正确的方式应是返回堆上内存地址,写法如下:
int* func()
{
int* pRet;
pRet = new int;
return pRet;
}。
其次,函数返回地址的情况不应滥用。实际上在编码过程中,原则是尽量避免指针类型的返回值。常用指针类型或者引用类型入参替代,目的是提高代码的可读性,避免内存泄露。避免内存泄露最好的原则是哪个函数里申请,就在哪个函数里释放。
最后,会用返回指针的函数。返回指针的函数应用最多的当属设计模式中的工厂模式。这属于面向对象的范畴,对象工厂负责构建和销毁对象,与函数的内存申请释放异曲同工。
总之,地址即内存管理,弄清这个关系,一切迎刃而解。