这是一些C ++代码:
#include <iostream>
class A
{
int x;
int y;
double v;
public:
A(int x, int y)
:x(x),y(y)
{
std::cerr << "A("<<x<<","<<y<<")\n";
}
~A()
{
std::cerr << "~A()\n";
}
operator double* ()
{
v=1.5*x+y;
return &v;
}
};
void f(double* val)
{
std::cerr << "f("<<*val<<")\n";
*val=0.3;
}
int main()
{
f(A(3,5));
}
我得到以下输出:
A(3,5)
F(9.5)
〜A()
即。因为我喜欢它的工作。但我不确定在 A
返回后是否必须将f
的析构函数称为。有保证吗?在operator double* ()
的调用中,f
返回的指针是否会以某种方式变为无效?
答案 0 :(得分:4)
您正在声明一个A对象作为f的实际参数,当您这样做时,对于所有效果,新对象就像f的局部变量所以〜保证在执行结束时调用A. / p>
如果f返回operator double* ()
返回的地址,并且在f返回后使用它,则将访问无效内存。避免这种情况的一种方法是使double v
静态但你必须考虑到,在你的代码中,A类创建的对象只在f块运行时退出。
答案 1 :(得分:3)
函数的参数在调用函数之前被计算,临时函数将存活到它们所在的完整表达式的末尾。所以是的,A
的实例将活到f
的调用结束。