本文探讨了C++中对象复制的机制,重点介绍了拷贝构造函数和拷贝赋值运算符的使用。文章指出,虽然memset
和memcpy
在某些情况下可以用于初始化或复制对象,但它们仅适用于POD(Plain Old Data)类型,否则可能导致未定义行为。对于非POD类型,推荐使用构造函数、成员函数(如clear()
)或STL算法(如std::fill
、std::copy
)来安全地初始化和复制对象。文章通过代码示例和外部参考链接,帮助读者理解如何正确管理对象的内存和复制行为。
通常我们使用对象内的拷贝构造函数和拷贝构造符来进行初始化和拷贝。
1 | class A |
关于memset
首先说结论,不推荐使用memset
对某个对象进行擦写内存。因为可能导致未定义行为。
具体可以查看stackflow
上的这个问题 memset for initialization in C++和Use memset or a struct constructor? What’s the fastest?
你可以使用构造函数进行初始化,也可以定义成员函数clear()
, 或是使用std::fill
, std::fill_n
。
在使用函数memset
时,有部分限定条件,只有目标对象为POD类型才可以使用。
简单来说就是,该对象如果没有继承,都是基础类型(如: int
、char
或其他POD
类型), 没有包含如std::array
, std::vector
等STL容器, 该对象可以称为POD
类型。如下面示例
1 | class pod |
关于POD
具体查看C++ named requirements: PODType
关于memcpy
结论是,不推荐使用,同样除了你能确保该对象为POD
类型,否则则会导致未定义现象。
可以使用拷贝构造函数或拷贝赋值符,或是std::copy
或std::copy_n
来代替memcpy
;