gpt4 book ai didi

c++ - 此代码行为是否定义明确?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:21 24 4
gpt4 key购买 nike

这是一些 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 的调用中变得无效?

最佳答案

您将 A 对象声明为 f 的实际参数,当您这样做时,对于所有效果而言,新对象就像 f 的局部变量,因此保证在 f 执行结束时调用 ~A。

如果 f 返回由 operator double* () 返回的地址,并且在 f 返回后使用它,您将访问无效内存。避免这种情况的一种方法是将 double v 设为静态,但您必须考虑到,在您的代码中,A 类创建的对象仅在 f block 运行时退出。

关于c++ - 此代码行为是否定义明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21112542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com