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

时间:2015-03-13 13:57:12

标签: c++ c++11

在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 ++字符串结构的memset会发生什么。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

没有人可以准确地说出在memcpy上使用非平凡可复制的类时会发生什么,因为它会给出未定义的行为。

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

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

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

当您使字符串超出其当前容量时,或者当您调用reserve来增加容量时,会自动进行分配。当字符串被销毁时,当你调用shrink_to_fit和(可能)字符串被清除时,自动释放会自动发生。

  

2)在使用C ++字符串的结构的memset上会发生什么。

未定义的行为。你只能使用普通类型的存储字节(甚至那时行为并不总是很明确); std::string并非无足轻重。

答案 1 :(得分:1)

当您通过memcpy复制对象时,您可以执行浅层复制。因此,假设字符串的数据存储在动态分配的数据中(由指针存储),唯一要复制的是指向数据的指针。这就是为什么在对象上使用memcpy不是一个好习惯!