在带有C++字符串的结构的 memcpy 上会发生什么

what will happen on memcpy of structures with C++ string

本文关键字:什么 memcpy 结构 C++ 字符串      更新时间:2023-10-16

下面的代码段在 codepad.org 中运行时不起作用。我在网上搜索了一下,以找到在带有C++弦的结构memcpy上究竟会发生什么。

#include <iostream>
using namespace std;
typedef struct {    
    int i;
    std::string data;
} ST_INFO;
int main ()
{
    ST_INFO stInfo1, stInfo2;
    stInfo1.i = 1;
    stInfo1.data.assign("test");
    memcpy(&stInfo2, &stInfo1, sizeof(stInfo2));
    cout << "data" << stInfo2.data.c_str();   
   return 0;
}

我无法得到简洁的答案。在寻找答案时,我最终遇到了更多问题。

附加问题:

1) 字符串的内存分配和释放是如何发生的。2)在带有C++字符串的结构的内存集上会发生什么。

这里有人可以帮我吗?

当你通过memcpy复制一个对象时,你会做浅层复制。因此,假设字符串将其数据存储在动态分配的数据中(由指针存储),唯一将被复制的是指向数据的指针。这就是为什么在对象上使用memcpy不是一个好的做法!

没有人能确切地说出当你在不可复制的类上使用memcpy时会发生什么,因为它给出了未定义的行为。

您可以使用其自动生成的复制构造函数或复制赋值运算符正确复制它:

stInfo2 = stInfo1;         // copy assignment
ST_INFO stInfo3 = stInfo1; // copy initialisation (using copy constructor)

1) 字符串的内存分配和释放是如何发生的。

当您

使字符串增长到超出其当前容量时,或者当您调用 reserve 来增加容量时,会自动进行分配。当字符串被销毁时、调用shrink_to_fit时以及(可能)在字符串被清除时,会自动解除分配。

2)在带有C++字符串的结构的内存集上会发生什么。

未定义的行为。您只能使用琐碎类型的存储字节(即使这样,行为也并不总是明确定义的); std::string不是小事。