foo函数有具体例子吗
时间: 2023-08-23 07:06:08 浏览: 51
当使用`shared_ptr`作为函数参数时,`foo`函数可以根据具体情况来确定是使用值传递还是引用传递。下面给出一个示例,展示如何使用`shared_ptr`作为函数参数,并在函数内部修改指针本身。
```c++
#include <iostream>
#include <memory>
void foo(std::shared_ptr<int>& ptr) {
std::cout << "Before reset: " << ptr.get() << std::endl;
ptr.reset(new int(42));
std::cout << "After reset: " << ptr.get() << std::endl;
}
int main() {
std::shared_ptr<int> ptr(new int(10));
std::cout << "Before foo: " << ptr.get() << std::endl;
foo(ptr);
std::cout << "After foo: " << ptr.get() << std::endl;
return 0;
}
```
在这个示例中,`foo`函数接受一个`shared_ptr`参数,通过调用`reset`函数将指针重置为新的`int`对象。由于我们需要修改指针本身,因此必须使用引用传递方式。
在`main`函数中,我们创建了一个`shared_ptr`对象,然后将其传递给`foo`函数。在`foo`函数内部,我们打印出指针在重置之前和之后的地址。在`main`函数中,我们也打印出了指针在函数调用之前和之后的地址。
运行这个程序,我们可以看到输出结果:
```
Before foo: 0x7ffcfb400b30
Before reset: 0x7ffcfb400b30
After reset: 0x7ffcfb400b60
After foo: 0x7ffcfb400b60
```
可以看到,在`foo`函数内部,指针被重置为新的`int`对象,其地址也发生了变化。在`main`函数中,我们也可以看到指针地址发生了相应的变化。由于使用了引用传递方式,`main`函数中的`ptr`和`foo`函数中的`ptr`指向的是同一个`shared_ptr`对象,从而确保了引用计数的正确维护和内存的正确释放。