C++内存拷贝函数

1.mencpy与mencpy_s

mencpy函数原型:

void *memcpy(void *dst ,const *src ,size_t count);

  作用:此函数用于对内存进行复制,按照字节复制。

参数:第一个参数是目标内存地址,第二个参数是源内存地址,第三个参数是字节数。

返回值:返回指针和参数中的指针都是void*类型的,因为是对内存字节进行复制,因此不必不必指定类型,复制完后,再将目标内存地址转换成你需要类型可。

memcpy函数中,直接对内存进行复制,按照内存地址,复制指定的字节数。若目标地址和原地址有一个为空,或者两个内存有重叠,或者拷贝元素太多到会内存溢出等操作都会出错。所以使用此函数前,一定要保证传入的参数的指针是有效的(不仅不为空,且指向的内存是有效的)。

mencpy_s函数原型:

errno_t memcpy_s(void *dst ,size_t sizeInBytes, const *src ,size_t count);

  作用:和memcpy一样,但是会进行反冲区检查,能够暴露内存溢出等问题。

  参数: 第一个参数为目标内存地址,第二个参数为目标内存缓冲大小,第三个参数为源内存地址,第四个为源内存缓冲的大小。

  返回值:返回值是一个错误码。

  这个版本中加入了基本的错误检测。如果源缓冲大小为0,即count为0,函数返回0,什么也不做。此函数没有对目标指针为NULL的情况,不做检查,所以你自己要注意检查。如果指针有值,但是是无效值,函数也没办法检查是否是有效内存,只是会搜集这些信息,在程序崩溃时提供调试需要的信息。

   然后检查源地址是否为空或count是否大于sizeInBytes,两个条件有一个满足,函数中先将目标内存以sizeInBytes指定的大小调用memset函数清0.这里可以看出,如果sizeInBytes传入的大小超出目标缓冲区的大小,也是会带来隐患的,一旦清除了其他进程的或者其他线程的内存,都是带来问题,也很可能导致内存操作违规。所以,第二个参数的大小不能超过目标缓冲的大小,以字节为单位。然后程序搜集错误信息,最后返回错误码,并不会执行内存复制的过程。前面说的这是两个条件任意一个进入都会导致失败,所以在搜集信息时,程序会对进入的条件进行判断,然后进行搜集。

  函数memcpy_s执行完毕后返回0,所以检查返回值是否为0不能判断是否成功。但是返回值为非零那就是失败了。

2.memmove与memmove_s

void *memmove(void *dest, const void *src, size_t n);  

errno_t memmove_s(void *dest, rsize_t destsz, const void *src, rsize_t count);

memmove和memcpy的作用是一样的,唯一区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

而对于第一种内存覆盖情况,memcpy的这种拷贝方式是可以的。但第二种情况memcpy就会出错,此时就需用memmove。

memmove_s和memcpy_s一样比memmove更安全。

 

posted @ 2018-03-20 20:07  daniumeng  阅读(5046)  评论(0编辑  收藏  举报