经常做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初始化就不会报错,之前会报错的原因是,申请了一个字节大小的空间但是初始化的空间远比一个字节大的多,造成内存的非法访问,所以系统会报错。