• frazer
    2019-11-26
    有点吃力了,得反复看几遍

    作者回复: 没关系。我打赌你看的时间肯定没我写稿的时间长。😁

     3
     31
  • yuchen
    2019-11-26
    有深度的专栏,不错。市面上讲解C++的课程一般太基础了。这一章推荐读者可以看看《Professional C++ 4th edition》第九章。

    作者回复: 谢谢。

    《Professional C++》之前没看过,扫了两眼,觉得内容不错,推荐。内容还挺多挺深的,适合决心在 C++ 上深入的同学。

     1
     12
  • NEVER SETTLE
    2019-11-27
    老师这块没想明白
    // 1、调用构造函数
    smart_ptr ptr1{create_shape(shape_type::circle)};

    // 2、因为拷贝构造被禁用,随意编译出错
    smart_ptr ptr2{ptr1}; // 编译出错

    smart_ptr ptr3;

    // 3、没明白为啥会出错
    ptr3 = ptr1; // 编译出错

    // 4、没明白为啥OK,=重载函数的参数不是右值引用呀
    ptr3 = std::move(ptr1); // OK,

    请老师指定 3 与 4
    展开

    作者回复: 3. 赋值需要一个对象(不是引用),因而在进入执行前就要引发一个构造。没有合适的构造函数可用。

    4. 同样,要先构造。这回可以用右值引用的构造函数了。

     1
     11
  • 流浪地球
    2019-11-26
    老师您好,问一个比较基础的问题,我理解这个语句
    smart_ptr<shape> ptr1{create_shape(shape_type::circle)}; 是调用ptr1的拷贝构造函数。
    为什么{create_shape(shape_type::circle)}是使用大括号,不应该是小括号吗?
    谢谢

    作者回复: 嘻嘻,我在偷偷地塞进C++11的语法。对象初始化可以统一用大括号。(小括号这儿也行。)

     2
     11
  • W.jyao
    2019-11-26
    对不熟悉C++ 11的程序员来看,有的地方不是很懂

    作者回复: 特别有困难的点可以提出。大部分概念的引入我应该都是有解释的。

    
     7
  • 皓首不倦
    2019-11-30
    请问下老师smart ptr 的拷贝构造函数为什么有一个泛型版本 还有一个非泛型版本 但是函数体内容又一模一样 不是代码冗余的吗 是有什么特殊设计意图吗 请老师指教下

    作者回复: 这是一个很特殊的、甚至有点恼人的情况。如果没有非泛型版本,编译器看到没有拷贝构造函数,会生成一个缺省的拷贝构造函数。这样,同样类型的smart_ptr的拷贝构造会是错误的。“子类指针向基类指针的转换”这一节里我也提到了这点。这不是我讲智能指针想讲的内容,所以就淡化了。

     1
     6
  • yyfx
    2019-11-28
    "移动"指针部分有个问题。在使用模板泛化拷贝构造时,p2=p1编译通过,程序异常。测试发现,由于拷贝构造并没有被自动禁用导致。查了下资料,effective45条提到,member templates不影响语言规则,声明member templates用于泛化copy构造时,还需要声明正常的copy构造。

    作者回复: 多谢抓虫。正文已更新。

    这也证明了,修改代码、没有完整测试,是极易招虫的啊……

    
     6
  • hdongdong123
    2019-11-27
    真的好难啊,呜呜呜

    作者回复: 一遍看不懂,就再看一遍。所有的代码自己试验一下。😀

    学习无捷径。掌握 C++ 不是 30 个课时能解决的事情。一万小时理论对于任何复杂领域都是基本适用的。

    
     6
  • Lilin
    2019-11-26
    才第二节,就有点吃力了。这篇专栏真是满满的干货

    作者回复: 希望是难,但还能看得下去。哈哈。

    
     6
  • 贵子
    2019-12-13
    为什么shared_count类作为smart_ptr的内部类编译不过,而必须作为外部类呢?老师能解释一下吗?谢谢!

    作者回复: 移进去的话,smart_ptr<circle>::shared_count 和 smart_ptr<shape>::shared_count 成了两个完全不相关的类型,它们的指针(在不做强制类型转换时)也不能互相赋值,不好。

     1
     5
  • NEVER SETTLE
    2019-11-27
    老师,问个比较基础的问题,就是运算符重载的时候,我老师搞不清 该返回值 还是 返回引用,这取决于什么?

    作者回复: 如果你搞不清,那多半就是不该返回引用的情况。下面会讲到这个话题。简单来说,大部分情况下,应该直接返回对象值。

     1
     5
  • lyfei
    2019-12-16
    老师您好,就是我们使用智能指针创建一个对象以后, 包括这个私有成员T* ptr_以及其他都是放在栈空间上的吧?这样就可以对象不在作用域以后,自动调用析构函数,然后delete开辟的相关空间了吧?
    智能指针实质上就是使用一个"栈"上的对象来管理一块内存地址(可能是堆可能是栈),用"栈"就可以保证析构函数的进行,也就保证了delete的进行,也就避免了内存泄露的问题。
    是不是可以这样理解?
    那我们应该什么时候使用new delete来管理内存,什么时候该使用智能指针呢?
    这些方面有些疑惑,谢谢老师您的讲解与回复。
    展开

    作者回复: 是,一般情况下是。但没人阻挡你写 new shared_ptr…。

    被管理的对象不会在栈上。只能是堆或者你的内存管理器使用的特殊区域。

    目前的推荐是不要使用裸指针。使用值,或者智能指针。

     1
     4
  • 姜姜
    2019-11-26
    这个smart_ptr目前已经实现了:获取所有权,共享所有权,拷贝赋值语意,计数器,自动增减等功能。
    还缺少: 转移所有权reset的操作(我记得reset有三种重载方式); 获取原始指针方法,重写解引用*,重写指向操作符->,重写比较操作符,获取引用计数器值的方法,判断当前引用是否为1的方法,以及线程安全的设计。
    最后,shared_ptr本身还需要解决“循环引用”,“自引用”的问题,一般需要搭配弱指针weak_ptr使用。
    老师,不知我回答的是否全面,有无差错?

    作者回复: 很全。有几个小问题哈(像reset有几个重载不算😄):

    获取原始指针的 get 方法我提供了;
    * 和 -> 代码里是提供的;
    引用计数器值也是有的。

    实践层面,最大的区别,除了不支持弱引用外,可能是不支持自定义删除器了。

     1
     4
  • 总统老唐
    2019-12-12
    吴老师,关于如何使用移动改善了 auto_ptr 的行为,实现了与 unique_ptr 相近的语义,这里的“改善”是否应该这样理解:
    1, 在没有引入右值引用和移动构造的情况下,构造的 auto_ptr 也能工作,但是会令用户困惑,当用户执行了语句 other_ptr = some_ptr 后,some_ptr 就为空了
    2, 引入右值引用和移动构造后,用户要想用重载的 operator=,必须采用 other_ptr = std::move(some_ptr) 的方式,通过显示调用 std::move,让用户aware到 some_ptr 的内容已经被移动到 other_ptr 了,并且同时默认禁用了参数为左值引用的拷贝构造,导致 other_ptr = some_ptr 无法通过编译,就不会在使用时产生歧义了,这就是 unique_ptr 期望的语义
    展开

    作者回复: 对。

    另外额外加一点,调用移动不一定靠 move。如果函数返回一个 unique_ptr 一样是自然的移动。

    
     3
  • 李良川
    2019-11-29
    完整的还缺++,- -,+=,-=,<,>等普通指针支持的操作

    作者回复: 嗯,是的。你是最早想起指针还有这些操作的。😁

    
     3
  • Zephyr
    2019-11-29
    老师,是一直没有更新吗,还是我看不到,我记得是买过这个课程了

    作者回复: 第一周一次性放三讲。后面每周更新三次,一次一讲。

    
     3
  • 小美
    2019-11-26
    计数器线程安全是不是更好点

    作者回复: 应该的。但我们还没学到通用的C++并发编程呢。

     2
     3
  • lyfei
    2019-12-04
    老师你好:
    【上面实现的最大问题是,它的行为会让程序员非常容易犯错。一不小心把它传递给另外一个 smart_ptr,你就不再拥有这个对象了……】
    smart_ptr<int> ptr2(ptr1)
    就是老师讲的这句话中,意思是在使用拷贝构造或者赋值运算符的时候,由于ptr_ = nullptr;的存在所以导致对象ptr1失效了?

    作者回复: 比如,如果你把这个指针传给另外一个函数,参数类型是smart_ptr,等函数返回,这个对象就消失了……

    
     2
  • metalmac.kyle
    2019-12-01
    通过老师的例子来学习深入学习智能指针,感觉这种案例式都谢谢代入感很强,再难的知识点也不枯燥还能直接学以致用,醍醐灌顶,有种重读csapp的感觉!Cpp一大特性就是各种复杂的语法以及符号设计,这让她被爱的人奉上神坛,恨的人也恨之入骨,指针作为双刃剑充满了恶魔般的魔力,虽然会让人望而却步但也是吸引我一直学习cpp的动力所在,对底层的操作和理解实在让人着魔哈哈。
    言归正传,小小的构造智能指针课蕴含了对Cpp一系列知识的复习巩固,构造函数,运算符重载,指针引用特性,模板等各类知识点的设计与实现,想真正掌握还需要反复上机实践呢,还是应了古话,纸上得来终觉欲知此事须躬行浅!🧐

    作者回复: 没错,相关的知识点很多,一定要多实践才行。

    不过,回过头来看,我觉得我拿智能指针开头,难度可能是有点设高了。哈哈。

    
     2
  • 墨梵
    2019-11-29
    吴老师讲的还是很好的,听着音频看代码感觉跟不上节奏,需要多看几遍才行。同时,文末放上链接也很不错。希望老师能多放些相关的学习推荐资源,授人以鱼不如授人以渔😀

    作者回复: 我知道、能想得起的参考资料肯定会贴出来。毕竟,三十讲的时间肯定是不够的。大家一定要阅读更多的资料才行。

    
     2
我们在线,来聊聊吧