在带有C++字符串的结构的 memcpy 上会发生什么
what will happen on memcpy of structures with C++ string
下面的代码段在 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
不是小事。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 对于单个数据 WORD 的 memcpy 和赋值语句有什么区别?
- 在从 C++ 转换为 C# 的代码中,我应该使用什么而不是 memcpy?
- 在带有C++字符串的结构的 memcpy 上会发生什么
- 编译器减少 std::copy to memcpy (memmove) 的条件是什么?
- 在什么平台上memmove和memcpy可以有显著的性能差异
- C++:使用 memcpy 时,myArray 和 &myArray 有什么区别?