memcpy并发场景下、srclen < dstlen出现的问题

场景

        场景1:多线程同时读写STL容器

        场景2:多线程同时读写内存buffer(字节流),通过memcpy拷贝

                                1. srclen dstlen一致的情况

                                 2. srclen dstlen不一致的情况

                                        ①srclen > dstlen src缓冲区没有被填充完整

                                        ②srclen < dstlen 当 dst 的长度大于 src 缓冲区大小时,std::memcpy() 函数会继续复制数据,直到 dst 的缓冲区末尾。这可能会导致覆盖其他内存区域的数据,从而导致程序崩溃或产生未定义的行为。

    如果使用 std::memcpy() 函数时,dst 的长度大于 src 的缓冲区大小,可能会导致内存访问越界的问题。这是因为 std::memcpy() 函数不会检查目标缓冲区的长度,而只是按照指定的长度从源缓冲区中复制数据到目标缓冲区中。

    当 dst 的长度大于 src 缓冲区大小时,std::memcpy() 函数会继续复制数据,直到 dst 的缓冲区末尾。这可能会导致覆盖其他内存区域的数据,从而导致程序崩溃或产生未定义的行为。

    因此,在使用 std::memcpy() 函数时,应该始终确保目标缓冲区的长度不大于源缓冲区的长度。可以使用 std::min() 函数来计算两个缓冲区的最小长度,以便安全地进行数据复制。

问题:以上两种场景下,应用程序的表现形式有啥区别?不考虑业务使用!

        场景1:数据不一致&&内存错误(崩溃)

        场景2:数据不一致&& 当srclen < dstlen会有内存错误(崩溃)

crash的原因

        STL容器内部有size增减操作,而这个会导致迭代器访问非法内存; 而字节流本身不会。字节流这种崩溃的原因大多数是——>>>由于数据错乱后,可能有野指针的访问等错误,最终会crash。也就是导致的连锁反应,不是读写buffer本身的崩溃。

知识

C++程序崩溃通常由以下几个原因导致:
        1. 未初始化的指针或引用:如果程序使用未初始化的指针或引用,就有可能访问到无效内存地址,导致程序崩溃。
        2. 数组越界:如果程序访问了数组越界的位置,就有可能访问到无效内存地址,导致程序崩溃。
        3. 内存泄漏:如果程序动态分配了内存但没有及时释放,就会导致内存泄漏,最终导致程序崩溃。
        4. 堆栈溢出:如果程序使用了太多的堆栈空间,就会导致堆栈溢出,最终导致程序崩溃。
        5. 空指针引用:如果程序使用了空指针,就会导致空指针引用,最终导致程序崩溃。
        6. 类型转换错误:如果程序进行了错误的类型转换,就有可能访问到无效内存地址,导致程序崩溃。
        7. 多线程错误:如果程序中存在多个线程,就有可能出现多线程错误,如竞争条件、死锁等,最终导致程序崩溃。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值