gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:51 24 4
gpt4 key购买 nike

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

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

最佳答案

一般情况下,是的,会有问题。 memcpymemmove 都是没有进一步语义的按位运算。这可能不足以移动对象*,显然也不足以复制

在复制的情况下,它会中断,因为多个对象将引用同一动态分配的内存,并且多个析构函数将尝试释放它。请注意,shared_ptr 等解决方案在这里无济于事,因为共享所有权是 进一步语义 的一部分,memcpy/memmove 不要提供。

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

一般的回答还是一样:不要


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

关于c++ - memcpy 或 memmove 会导致复制类出现问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12135769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com