memcpy内存拷贝和=直接赋值有什么区别

memcpy会执行数据复制,而赋值语句只是简单将一个指针的值传给另一个指针,指针对应的存储空间的内容并不会改变。

 

 

图解

"="操作一般不会分配内存(在声明初始化时会分配),memcpy()函数的字面意思就是内存拷贝,把一块内存中的数据拷贝给另一块内存,这个过程中有新的内存分配了。

 

 

memcpy从名字上也可以理解出来是把内存拷贝,也就是说把一个内存里面的东西拷贝到另一个内存中。而赋值就不一定了,比如两个声明为整形变量的变量,赋值就是跟memcopy一样,但一个是整形指针一个是整形变量有不一样了,赋值也只能把地址赋给指针,不是把内存里面的数据给它

来源:https://ask.csdn.net/questions/325255

 

 

 

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C/C++中,memcpy是一种内存拷贝函数,它可以将一段内存空间中的内容原封不动地拷贝到另外一段内存空间中。memcpy拷贝实际上是浅拷贝,也就是说,如果拷贝的是内置类型的元素,memcpy即高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错。因为浅拷贝只是拷贝了指针,而没有拷贝指针所指向的内存,这样就会导致多个对象共享同一块内存,从而可能会引起内存泄漏甚至程序崩溃。 为了避免这种情况,我们需要使用深拷贝。深拷贝是指在拷贝对象时,不仅要拷贝对象本身,还要递归地拷贝对象所包含的所有子对象,直到所有子对象都被拷贝完毕。这样就可以保证每个对象都有自己独立的内存空间,不会相互影响。 在C++中,可以通过拷贝构造函数和赋值运算符来实现深拷贝拷贝构造函数是在创建一个新对象时,以已存在的对象作为参数,使用已存在对象的值来初始化新对象的成员变量。赋值运算符则是在已有对象的基础上,将另一个对象的值赋给该对象。 下面是一个使用拷贝构造函数和赋值运算符实现深拷贝的例子: ```c++ #include <iostream> #include <cstring> using namespace std; class String { public: String(const char* str = nullptr); // 构造函数 String(const String& other); // 拷贝构造函数 ~String(); // 析构函数 String& operator=(const String& other); // 赋值运算符 void print() const; // 打印字符串 private: char* m_data; // 字符串指针 int m_length; // 字符串长度 }; String::String(const char* str) { if (str == nullptr) { m_length = 0; m_data = new char[1]; *m_data = '\0'; } else { m_length = strlen(str); m_data = new char[m_length + 1]; strcpy(m_data, str); } } String::String(const String& other) { m_length = other.m_length; m_data = new char[m_length + 1]; strcpy(m_data, other.m_data); } String::~String() { delete[] m_data; } String& String::operator=(const String& other) { if (this != &other) { delete[] m_data; m_length = other.m_length; m_data = new char[m_length + 1]; strcpy(m_data, other.m_data); } return *this; } void String::print() const { cout << m_data << endl; } int main() { String str1("Hello"); String str2(str1); // 使用拷贝构造函数 String str3 = str1; // 使用赋值运算符 str1.print(); // 输出:Hello str2.print(); // 输出:Hello str3.print(); // 输出:Hello str2 = "World"; // 使用赋值运算符 str2.print(); // 输出:World return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值