当前位置: 首页 > 知识库问答 >
问题:

C 纠缠共享指针

柳韬
2023-03-14

我在“C编程语言,第4版”第17.5.1.3章中找到了下面的代码

struct S2 {
    shared_ptr<int> p;
};

S2 x {new int{0}};

void f()
{
    S2 y {x};                // ‘‘copy’’ x
    ∗y.p = 1;                // change y, affects x
    ∗x.p = 2;                // change x; affects y
    y.p.reset(new int{3});   // change y; affects x
    ∗x.p = 4;                // change x; affects y
}

我不明白最后一条评论,确实y.p应该在reset()调用后指向一个新的内存地址,所以

    ∗x.p = 4; 

应该让y.p不变,不是吗?

谢谢

共有1个答案

鲁乐
2023-03-14

这本书错了,你是对的。您可以考虑将此文件发送给比亚恩,以便在下次打印时修复。

正确的注释可能是:

S2 y {x};                // x.p and y.p point to the same int.
*y.p = 1;                // changes the value of both *x.p and *y.p
*x.p = 2;                // changes the value of both *x.p and *y.p
y.p.reset(new int{3});   // x.p and y.p point to different ints.
*x.p = 4;                // changes the value of only *x.p
 类似资料:
  • 问题内容: 我已经尝试了好几个小时,并且用谷歌搜索了所有我想到的东西,但是我快要疯了。 我有一个结构: 直到以后,我才知道int (矩阵)和char 的大小。 完成后,我将创建共享内存,如下所示: 没问题 然后,我给ctrl-> rows和collumns赋一个值,并将0赋给所有矩阵。 但是之后,我在char *和bam中写了一些段错误。 调试程序时,我看到mat和IDs_row这两个指针都为nu

  • 我只是简单地从网络获取数据包,并在一个线程中将它们排队,然后在另一个线程中使用此数据包(取消排队)。 所以我决定使用boost库来创建一个基于https://www.quantnet.com/cplusplus-multithreading-boost/ 问题是,虽然没有得到任何数据,但Dequeue()方法会阻塞我的使用者线程,当我想终止使用者线程时,有时我无法结束或停止它。 结束Dequeue

  • 指针是C/C++区别于其他语言的最强大的语法特性,借助指针,C/C++可以直接操纵内存内容。但是,指针的引入也带来了一些使用上的困难,这要求程序员自己必须手动地对分配申请的内存区进行管理。 shared_ptr基本用法 智能指针的行为类似于常规指针,重要的区别是它负责自动释放所指向的对象。新标准提供的两种重要的智能指针的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象;u

  • shared_ptr被用来表示共享的拥有权。也就是说,当两段代码都需要访问一些数据,而它们又都没有独占该数据的所有权(从某种意义上来说就是该段代码负责销毁该对象)。这是我们就需要shared_ptr。shared_ptr是一种计数指针。当引用计数变为0时,shared_ptr所指向的对象就会被删除。下面我们用一段代码来说明这点。 void test() { shared_ptr p1(ne

  • 问题内容: 我有一些称为的数据,该数据位于三个孩子的父对象的范围内: 在这三个指令之间共享的最佳方法是什么?选项包括: 使用隔离的范围传递三遍,从而跨四个范围复制它 让子指示继承父范围,并找到,或在 把上并注入到这一点的子指示 还是有另一种更好的方法? 问题答案: 您可以创建一个工厂,该工厂可以传递给每个指令或控制器。这样可以确保在任何给定时间只有一个数组实例。编辑:这里唯一的陷阱是确保您在指令作

  • 问题内容: 这是使用g ++ 进行动态共享库编译的后续版本。 我正在尝试在Linux上的C++中创建一个共享的类库。当我尝试使用库中定义的类时,我的问题开始了。我链接到的第二篇教程展示了如何加载用于创建库中定义的类的对象的符号,但是没有_使用_ 这些对象来完成任何工作。 有谁知道用于创建共享C ++类库的更完整的教程,该教程还显示了如何在单独的可执行文件中 使用 这些类?一个非常简单的教程,显示了