非pod类型使用write read函数进行文件操作导致崩溃

⌚Time: 2022-12-27 12:12:42

👨‍💻Author: Jack Ge

c++中POD类型和non-POD类型AI介绍:

POD vs non-POD类型

POD类型(Plain Old Data)

struct Point { int x, y; };  // POD
int arr[10];                 // POD

non-POD类型

class Widget {
    virtual ~Widget();       // non-POD
    std::string name;        // non-POD(string是non-POD)
};

核心区别

  1. 内存操作:POD可用memcpy/memset,non-POD不行
  2. 初始化:POD支持{}初始化,non-POD需要构造函数
  3. C兼容性:POD可传递给C函数,non-POD不能
  4. 布局:POD内存布局确定,non-POD可能有虚表指针

实际影响

// POD
Point p = {1, 2};           // OK
memcpy(&p2, &p, sizeof(p)); // OK

// non-POD  
std::string s1 = "hello";
// std::string s2 = s1;     // 需要复制构造函数
// memcpy(&s2, &s1, ...);   // 错误!会崩溃

一句话总结:需要低级内存操作或C互操作时用POD,否则用non-POD特性。


非pod类型的对象实例,使用write,read函数,直接将对象保存和读取到文件时会崩溃,只能选择合适的序列和反序列化方法,将对象中的各种数据类型保存到文件,读取时再进行恢复到对象中。