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

     2023-02-21     135

关键词:

【中文标题】如果指针值作为引用传递,该值的生存期是多久? [复制]【英文标题】: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 中取消引用双指针(指向值的指针)

】在GDB中取消引用双指针(指向值的指针)【英文标题】:Dereferenceadoublepointer(apointertoapointertoavalue)inGDB【发布时间】:2021-09-2212:13:10【问题描述】:我正在编写一个脚本来对可执行文件进行逆向工程。我有一种情况,RAX是一个... 查看详情

右值引用,移动语义,完美转发

...a=1;int&b=a;此时引用指向一个左值,该引用是一个左值引用如果使用int&b=1;就会报错c++还允许使用引用指向右值,即所谓的右值引用classA;int&&b=1;int&&c=A();//指向一个A类的临时变量右值引用延长了临时变量的生存时间首先回到我们使... 查看详情

值传递和引用传递

...个函数的时候,函数接收的是原始值的一个副本,因此,如果函数修改了该参数,仅仅修改的是参数的副本,而原始值保持不变。按引用传递一位置当一个参数传递给一个函数的时候,函数接收的是原始值的内存地址,而不是值... 查看详情

深浅拷贝

...所有引用此值的变量都会被更新。在复制对象的过程中,如果仅复制了引用指针,则称为浅复制;复制了真实值,则称为深复制。浅拷贝:浅拷贝一般都是直接将对象赋值给新变量就完事儿了, 查看详情

go一文搞懂指针和地址值的区别

...Age函数修改的是学生的一个备份,而不是原始的学生对象如果你想正确的给学生年龄增加的话,函数传递的需要是这个值的指针,如下所示:需要注意的是,这里我们的指针传递的仍然是一个拷贝,比如,如果你将s赋值给另外... 查看详情

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

...言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。   以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n,所以n的值仍然是0. voidFun... 查看详情

c++指针和引用的区别

1.指针与引用区别指针是一块内存的地址值,访问变量是间接访问,引用是一块内存的别名,访问变量是直接访问.引用是一个变量的别名,本身不单独分配自己内存空间,而指针有自己的内存空间.引用使用时无须解引用(*),指针需要解... 查看详情

传指针和传指针引用的区别/指针和引用的区别(本质)

...操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用... 查看详情

参数传递(值传递与引用传递)

...给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,... 查看详情

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

...,包括指针。Go中没有“按引用传递”。【参考方案1】:如果您将接口值传递给采用接口的函数,则它会被传递而无需任何进一步处理。如 查看详情

以对象作为属性值的反应选择选项

】以对象作为属性值的反应选择选项【英文标题】:Reactselectingoptionwithobjectasattributevalue【发布时间】:2017-07-2217:10:34【问题描述】:当我想更改所选选项时,我遇到了反应问题。问题是该值是一个对象,我不能在选项值属性中... 查看详情

按值传递与按引用或指针传递的性能成本?

...指针)会导致更高的性能,因为我们避免制作本地副本(如果f 查看详情

c#在方法调用中,参数按值传递与按引用传递的区别是啥?

...引用类型.C#给它增加个字符恒定的特性.  C#函数的参数如果不加ref,out这样的修饰符显式申明参数是通过引用传递外,默认都是值传递.3.这里要注意的一个问题是,参数的类型是值类型还是引用类型和传参数时用值传递还是引用传... 查看详情

值传递和引用传递的区别

...最清楚了,例如我们定义一个数组a[]=1,2;那么a[0]=1,a[1]=2。如果我们把数组a里的元素值作为参数传递,实际上只是进行了值传递,对数组本身没有影响如果我们把数组a的指针作为参数传递,那么假如处理的函数就可以直接修改数... 查看详情

java到底是值传递还是引用传递?

Java中方法参数传递方式是按值传递。如果参数是基本类型,传递的是基本类型的字面量值的拷贝。如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。以上引用自知乎:Java到底是值传递还是引... 查看详情

java到底是值传递还是引用传递?

Java中方法参数传递方式是按值传递。如果参数是基本类型,传递的是基本类型的字面量值的拷贝。如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。以上引用自知乎:Java到底是值传递还是引... 查看详情

为啥我不能在同一个结构中存储一个值和对该值的引用?

】为啥我不能在同一个结构中存储一个值和对该值的引用?【英文标题】:Whycan\'tIstoreavalueandareferencetothatvalueinthesamestruct?为什么我不能在同一个结构中存储一个值和对该值的引用?【发布时间】:2015-11-2419:58:01【问题描述】:... 查看详情

为啥我不能在同一个结构中存储一个值和对该值的引用?

】为啥我不能在同一个结构中存储一个值和对该值的引用?【英文标题】:Whycan\'tIstoreavalueandareferencetothatvalueinthesamestruct?为什么我不能在同一个结构中存储一个值和对该值的引用?【发布时间】:2021-08-2705:45:48【问题描述】:... 查看详情