跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • C++的缺省拷贝构造和浅拷贝有没有区别?
未分類
7 2 月 2021

C++的缺省拷贝构造和浅拷贝有没有区别?

C++的缺省拷贝构造和浅拷贝有没有区别?

資深大佬 : James369 1

比如一个类:

class Test { public:     std::string s;    //s 在浅拷贝的时候,是否会调用 std::string 的拷贝构造?     float a; }  std::shared_ptr<Test> function() {     ...     auto test = Test();  //栈上创建     test.s = "aaa";         test.a = 111;     auto result = std::make_shared<Test>(test);  //调用 Test 缺省构造函数,即 memcpy?     return result; }  int main() {     auto ret = function();     ... }  

此时发生浅拷贝,如果直接 memcpy 覆盖过去,那么成员变量 s 指向的字符串的内容是栈上的,离开栈就会发生内存访问错误。但实际测试并没有发生内存错误。

大佬有話說 (15)

  • 資深大佬 : norz

    string 的拷贝构造会执行

  • 資深大佬 : auto8888

    string 不是指针成员呢,亲亲。

  • 資深大佬 : norz

    浅拷贝并不是 memcpy,而是直接赋值

  • 資深大佬 : owwlo

    像上说的,默认是拷贝构造函数并不会是 memcpy,即使是编译器优化,我“猜”编译器也只会对 std:: is_trivially_copyable 的结构执行 memcpy 。

  • 主 資深大佬 : James369

    @norz 如果是这样,那么浅拷贝就不是简单的 memcpy 的二进制复制了?

  • 資深大佬 : freemon

    stl::string 抽象出来的代码不是这样吗

  • 資深大佬 : freemon

    class string {
    enum { _BUF_SIZE = 16 };
    union _Bxty {
    // storage for small buffer or pointer to larger one
    char _Buf[_BUF_SIZE];
    char* _Ptr;
    } _Bx;
    size_t _Mysize; // current length of string
    size_t _Myres; // current storage reserved for string
    };

  • 資深大佬 : levelworm

    浅拷贝就是一个个 bit 复制过去吧?类里带指针需要在堆上创建对象的必须用深拷贝。

  • 資深大佬 : auto8888

    “aaa” 存储在文字常量区

  • 資深大佬 : hitmanx

    string 不是 const char*,它是把字符串存在 heap 里的。且哪怕是 const char*,这个指针指向也是没问题的。就像上说的,”aaa”是在常量区的,而不是注释里写的在栈上

  • 資深大佬 : amaranthf

    浅拷贝,指的是一种“变量间赋值的方式”,而“class 的默认复制构造并非浅拷贝”。
    class 的默认复制构造函数中,只有对指针成员才会进行浅拷贝,即直接赋值,对对象类型的成员会执行其默认复制构造。

  • 資深大佬 : alazysun

    缺省的拷贝构造就是浅拷贝,但对有拷贝构造函数的成员,则会调用它的拷贝构造。

  • 資深大佬 : lvzx

    你自己写个类,拷贝构造加点打印不就知道了?自动生成的拷贝构造函数,会调用成员变量的拷贝构造函数,所以 string 当然不会有问题

  • 資深大佬 : xuanbg

    浅拷贝只是复制指针,深拷贝是复制数据+新的指针。

  • 資深大佬 : walker522

    深浅拷贝是相对于能否级联复制指针所指内容的,是类型的拷贝函数设计问题。
    而正确设计的对象和基本类型是可以自动级联复制。
    make_shared 先在堆上分配内存,再执行对象拷贝。
    string 拷贝内部会进行了指针内容拷贝,是深拷贝。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具