gpt4 book ai didi

c++ - 如果将指针值作为引用传递,该值的生存期是多久?

转载 作者:行者123 更新时间:2023-12-02 10:11:50 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





C++ delete - It deletes my objects but I can still access the data?

(13 个回答)


1年前关闭。




我想我理解 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 的指针(在这种情况下 x 中的 C1 )应该导致段错误?
  • 第二个 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 ?

    最佳答案

    1. How can the first cout print 5.

    因为程序的行为是未定义的。
    1. ... Since z is deleted in func_p shouldn't this also result in segmentation fault?

    不需要存在段错误。程序的行为是未定义的。

    关于c++ - 如果将指针值作为引用传递,该值的生存期是多久?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63223169/

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