如果指针值作为引用传递,该值的生存期是多久? [复制]
Posted
技术标签:
【中文标题】如果指针值作为引用传递,该值的生存期是多久? [复制]【英文标题】:If a pointer value is passed as reference, how long does the value live? [duplicate] 【发布时间】:2020-08-03 03:04:35 【问题描述】:我想我理解 pass-by-value 和 pass-by-reference 背后的基本思想。我创建了一个玩具代码来解释我的问题:
class C2
public:
int val;
C2()
~C2()
;
class C1
public:
C2 * x;
C1(C2 & x_)
x = &x_;
C1()
~C1()
;
void func (C1 & y)
C2 z;
z.val = 5;
y = C1(z);
void func_p (C1 & y)
C2 * z;
z = new C2();
z->val = 5;
y = C1(*z);
delete z;
int main()
C1 m_y1;
func(m_y1);
cout << m_y1.x->val << endl; // Prints 5
C1 m_y2;
func_p(m_y2);
cout << m_y1.x->val << endl; // Prints junk instead of seg fault
return 0;
我有以下问题:
-
第一个 cout 怎么打印 5. 对象
z
是 func
的本地对象,在 func 退出后会超出范围。那么访问指向z
的指针(在本例中为C1
中的x
)应该会导致分段错误?
第二个 cout 打印垃圾(32766 左右)。由于z
在func_p
中被删除,这不应该也导致分段错误吗?
编辑:
谢谢(我将删除这个问题,因为它被标记为重复,我可以理解为什么它是重复的。我只是被这些参考通行证所困扰!)
只是为了澄清我的理解,请考虑func_c
void func_c (C2 & y)
C2 z;
z.val = 5;
y = z;
int main()
C1 a;
a.x = new C2();
func_c(*(a.x));
cout << a.x->val << endl; // Prints 5
我假设这将是一个已定义的行为,因为将调用复制函数。最初a.x = new C2()
,在调用func
之后,z
对象被复制到a.x
?
【问题讨论】:
m_y1.x->val
表现出未定义的行为,通过在对象的生命周期结束后访问对象。 “似乎有效”是未定义行为的一种可能表现形式。 “打印垃圾”是另一个。
您不需要删除您的问题。可以不删除它但将其作为另一个答案的“路标”关闭。
【参考方案1】:
第一个 cout 怎么打印 5.
因为程序的行为是未定义的。
...既然 z 在 func_p 中被删除,这不应该也导致分段错误吗?
没有分段错误的要求。程序的行为未定义。
【讨论】:
谢谢。我将删除这个问题,因为它似乎是重复的。但是,在那之前我有一个问题来巩固我的理解,已经编辑了这个问题。 @AndrewMathews 是的。据我所知,新示例定义良好。 谢谢!我在更大的代码库中遇到了这个问题,并且正在疯狂地调试它。我会尽快删除这个问题。以上是关于如果指针值作为引用传递,该值的生存期是多久? [复制]的主要内容,如果未能解决你的问题,请参考以下文章