C++ memcpy';ing std::C+中的字符串+;

C++ memcpy';ing std::C+中的字符串+;,c++,memcpy,C++,Memcpy,对于特征矩阵库,有人提出了以下问题: 据我所知,问题在于不能对两个std::string进行基于memcpy的交换 在这里记忆似乎并不可取,但我也不理解记者指出的问题 如果std::string在概念上是: class string { union { class heap_str_ { char* str_; size_t len_; } char small_st

对于特征矩阵库,有人提出了以下问题:

据我所知,问题在于不能对两个std::string进行基于memcpy的交换

在这里记忆似乎并不可取,但我也不理解记者指出的问题

如果std::string在概念上是:

class string
{
    union
    {
        class heap_str_
        {
            char* str_;
            size_t len_;
        }
        char small_str[16];
    }

};
我认为在memcpy(?)下,这两个都是可以的(所有权问题无法承受,我想交换也可以)


我在这里遗漏了什么?

该bug包含以下详细信息:

内部数据不是存储位置不变的(将偏移量存储到此位置)

这立刻使你的假设失效

结构可能大致如下:

class string
{
    char* str_;
    union
    {
        size_t len_;
        char small_str[16];
    };
};

这样就可以访问
str
,而无需在每次访问时检查SSO。

问题在于SSO对
memcpy
不安全,因为指向数据的指针通常会重定向到对象堆栈部分内的内部缓冲区。因此,当对象复制到新位置时,指针仍然指向旧对象内的(旧的,可能不再有效的)位置

当然,
std::string
(以及所有非POD类型)通常首先不应该是
memcpy
,特别是在涉及堆分配时,因为它至少有双重删除或堆损坏的风险


所以不,你不应该,永远,永远,
memcpy
。即使你认为你应该/需要这样做。使用
std::copy
或找出其他方法。

您不能memcpy非POD,尤其是具有原始指针的POD。如果
memcpy
,并且源超出范围,指针
str
会发生什么情况?@Slava指针本身就是POD,OP的数据结构也是POD。显然,所有权语义是一个考虑因素,但指针本身完全可以作为memcpy的工具ed@Frank也许我自己不太清楚——这个对象拥有动态分配内存的原始指针。而且数据结构OP提到的绝对不完整,因为它是关于
std::string
的,几乎可以肯定的是,您的
string
类将管理
str\uu
delete
指向的缓冲区,或者在它的生命周期结束时释放它。通过对实例进行逐位复制,您将拥有两个对象,这两个对象都假定拥有该缓冲区的所有权。我想我的部分困惑是,std::string真的不是存储位置的不变量吗?好的,灯泡亮了。谢谢web上的一些其他实现建议像我一样实现,但看起来您的实现在实践中更为常见。事实上,这并不是一个概念性的记忆。