如果指针值作为引用传递,该值的生存期是多久? [复制]

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. 对象 zfunc 的本地对象,在 func 退出后会超出范围。那么访问指向z 的指针(在本例中为C1 中的x)应该会导致分段错误? 第二个 cout 打印垃圾(32766 左右)。由于zfunc_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-&gt;val 表现出未定义的行为,通过在对象的生命周期结束后访问对象。 “似乎有效”是未定义行为的一种可能表现形式。 “打印垃圾”是另一个。 您不需要删除您的问题。可以不删除它但将其作为另一个答案的“路标”关闭。 【参考方案1】:
    第一个 cout 怎么打印 5.

因为程序的行为是未定义的。

    ...既然 z 在 func_p 中被删除,这不应该也导致分段错误吗?

没有分段错误的要求。程序的行为未定义。

【讨论】:

谢谢。我将删除这个问题,因为它似乎是重复的。但是,在那之前我有一个问题来巩固我的理解,已经编辑了这个问题。 @AndrewMathews 是的。据我所知,新示例定义良好。 谢谢!我在更大的代码库中遇到了这个问题,并且正在疯狂地调试它。我会尽快删除这个问题。

以上是关于如果指针值作为引用传递,该值的生存期是多久? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将参数作为接口传递[重复]

值传递和引用传递的区别

在 GDB 中取消引用双指针(指向值的指针)

引用与指针的区别

到底C语言的指针有多强大?

指针和引用用于函数值传递