Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ memcpy或memmove会导致复制类时出现问题吗?_C++_Class_Memcpy_Memmove - Fatal编程技术网

C++ memcpy或memmove会导致复制类时出现问题吗?

C++ memcpy或memmove会导致复制类时出现问题吗?,c++,class,memcpy,memmove,C++,Class,Memcpy,Memmove,假设我有任何类型的类或结构。没有虚拟函数或任何东西,只有一些自定义构造函数,以及一些需要在析构函数中清理的指针 在该结构上使用memcpy或memmove是否会有任何不利影响?删除移动的结构是否会导致问题?这个问题假设内存对齐也是正确的,我们正在复制到安全内存。通常在基于类的对象上使用memcpy不是一个好主意。最可能的问题是复制指针,然后将其删除。您应该使用复制构造函数或赋值运算符。通常在基于类的对象上使用memcpy不是一个好主意。最可能的问题是复制指针,然后将其删除。您应该改用复制构造函数

假设我有任何类型的类或结构。没有虚拟函数或任何东西,只有一些自定义构造函数,以及一些需要在析构函数中清理的指针


在该结构上使用memcpy或memmove是否会有任何不利影响?删除移动的结构是否会导致问题?这个问题假设内存对齐也是正确的,我们正在复制到安全内存。

通常在基于类的对象上使用memcpy不是一个好主意。最可能的问题是复制指针,然后将其删除。您应该使用复制构造函数或赋值运算符。

通常在基于类的对象上使用memcpy不是一个好主意。最可能的问题是复制指针,然后将其删除。您应该改用复制构造函数或赋值运算符。

不,不要这样做

如果你
memcpy
一个结构的析构函数删除了它自身的一个指针,那么当该结构的第二个实例以任何方式被销毁时,你都会执行双重删除

<> > C++习惯用法是类的复制构造函数和<代码> STD::复制< /代码>或其任何复制范围/序列/容器的朋友。< /P> < P>不,不要这样做。 如果你
memcpy
一个结构的析构函数删除了它自身的一个指针,那么当该结构的第二个实例以任何方式被销毁时,你都会执行双重删除


<> > C++习语是类的复制构造函数和<代码> STD::复制< /代码>或其任何复制范围/序列/容器的朋友。

除了安全性外,这是其他答案已经指出的最重要的问题,也可能存在性能问题,尤其是对于小对象。p>


即使对于简单的POD类型,您也可能会发现,在复制构造函数的初始值设定项列表中进行正确的初始化(或根据您的使用情况在赋值运算符中赋值)实际上甚至比内在版本的
memcpy
都要快。这很可能是由于memcpy的输入代码可能会检查字对齐、重叠、缓冲区/内存访问权限等。。。。在Visual C++ 10和更高版本中,给你一个具体的例子,你会惊讶于在MEMCY开始逻辑功能之前测试各种事物执行的前导码。

除了安全性之外,这是其他答案已经指出的最重要的问题,也可能存在性能问题。特别是对于小物体


即使对于简单的POD类型,您也可能会发现,在复制构造函数的初始值设定项列表中进行正确的初始化(或根据您的使用情况在赋值运算符中赋值)实际上甚至比内在版本的
memcpy
都要快。这很可能是由于memcpy的输入代码可能会检查字对齐、重叠、缓冲区/内存访问权限等。。。。在Visual C++ 10和更高版本中,给你一个具体的例子,你会惊讶于在MeMCY开始逻辑功能之前测试各种事物执行的前导码。
memcpy
memmove
都是按位操作,没有进一步的语义。这可能不足以移动对象*,而且显然不足以复制

在复制的情况下,它将中断,因为多个对象将引用同一个动态分配的内存,并且多个析构函数将尝试释放它。请注意,像
shared\u ptr
这样的解决方案在这里没有帮助,因为共享所有权是
memcpy
/
memmove
不提供的进一步语义的一部分

用于移动,根据类型,在某些情况下,您可能会侥幸逃脱。但是,如果对象包含指向正在移动的元素的指针/引用(包括自引用),那么它将不起作用,因为指针将按位复制(同样,没有进一步的复制/移动语义)并将引用旧位置

一般的答案仍然是一样的:不要



*不要在这里采取完全C++11意义上的行动。我已经看到了一个标准库容器的实现,它使用特殊标记来支持移动对象,同时通过使用
memcpy
来增加缓冲区,但它需要在存储类型中使用显式注释,将对象标记为可通过
memcpy
安全移动,将对象放入新缓冲区后,旧缓冲区被丢弃,而不调用任何析构函数(C++11移动需要将对象保持在可破坏状态,这无法通过此攻击实现)

在一般情况下,是的,会有问题。
memcpy
memmove
都是按位操作,没有进一步的语义。这可能不足以移动对象*,而且显然不足以复制

在复制的情况下,它将中断,因为多个对象将引用同一个动态分配的内存,并且多个析构函数将尝试释放它。请注意,像
shared\u ptr
这样的解决方案在这里没有帮助,因为共享所有权是
memcpy
/
memmove
不提供的进一步语义的一部分

用于移动,根据类型,在某些情况下,您可能会侥幸逃脱。但是,如果对象包含指向正在移动的元素的指针/引用(包括自引用),那么它将不起作用,因为指针将按位复制(同样,没有进一步的复制/移动语义)并将引用旧位置

一般的答案仍然是一样的:不要


*不要在这里采取完全C++11意义上的行动。我已经看到了一个标准库容器的实现,它使用特殊的标记来在g
template<typename T>
class MemcopyableArray
{
    static_assert(std::is_trivially_copyable<T>::value, "MemcopyableArray used with object type that is not trivially copyable.");
    // ...
};