memset 无法初始化较大堆空间

经常做C++的朋友估计遇到过这样的问题,使用new申请的较大空间(大于200*1024 byte),无法使用memset初始化,

例如如下代码可以编译通过,但是运行时会中断,提示内存的非法访问:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_SIZE 2 * 1024 * 1024

int main()
{
    int m_frameSize = MAX_SIZE;

    unsigned char* m_pTmpFrame = (unsigned char*) new unsigned char(m_frameSize * sizeof(unsigned char));
    memset(m_pTmpFrame, 0, sizeof(unsigned char) * (m_frameSize));

    return 0;
}

解决办法:问题原因不在于memset()函数,在于用new申请的空间。申请堆空间时使用malloc代替new,该问题即可得到解决。

改成如下代码就可以编译通过且可以顺利运行:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_SIZE 2 * 1024 * 1024

int main()
{
    int m_frameSize = MAX_SIZE;

    unsigned char* m_pTmpFrame = (unsigned char*) malloc (m_frameSize * sizeof(unsigned char));
    memset(m_pTmpFrame, 0, sizeof(unsigned char) * (m_frameSize));

    return 0;
}

这就叫“知做不知窍,惹得神鬼笑”,为什么会这样?new与malloc究竟有什么区别,请知情的大神在评论中解释

****************************************************************************************************************************

星号线之上是原来自己写的博客,并且给出了提问,现在自己来回答一下:

首先要强调的是:不是用new申请的空间无法用memset初始化,上面代码中new的使用方法是错误的,语句

unsigned char* m_pTmpFrame = (unsigned char*) new unsigned char(m_frameSize * sizeof(unsigned char));

并不是申请了大小为‘m_frameSize * sizeof(unsigned char)’的空间,而是只申请了一个字节的空间,同时使用

‘m_frameSize * sizeof(unsigned char)’的值来初始化,要想申请大小为‘m_frameSize * sizeof(unsigned char)’的空间,正确的语句应该是:

unsigned char* m_pTmpFrame = (unsigned char*) new unsigned char[m_frameSize * sizeof(unsigned char)];

用这条语句申请的空间使用memset初始化就不会报错,之前会报错的原因是,申请了一个字节大小的空间但是初始化的空间远比一个字节大的多,造成内存的非法访问,所以系统会报错。

猜你喜欢

转载自blog.csdn.net/heibao111728/article/details/80438449