几个常用的内存分配函数
void* malloc(size_t size)
void* calloc(size_t memb,size_t size)
void* realloc(void *p,size_t size)
void* aligned_alloc(siee_t alignment, size_t size)
所引发的错误
- 1.初始化错误
- 2.未检查返回值
- 3.对空指针或无效指针解引用
- 4.引用已释放的内存
- 5.对同一块内存释放多次
- 6.内存泄漏
- 7.零长度分配
1.初始化错误
使用malloc()函数在堆区申请的内存块,可能是上一个程序的遗留,具有隐私信息; 由此引发了三个标准
1."不要假定内存分配函数已经初始化" -(C安全编码标准)
2."不要引用未初始化内存 " -(C安全编码标准)
3."清除可能重复使用资源中的敏感信息" -(C安全编码标准)
2.未检查返回值
sign* start = malloc(nmuOfRecodrds * sizeof(sign));
sign* point=(sign*)start;
point=start+tempNum-1;
3.空指针或无效指针解引用
无效指针解引用:就是指引用无效值:空指针,
未按照指定对象类型的正确对齐地址,生存周期结束后的对象地址;
4.引用已释放的内存
看对象所存储的内存模型是哪里,还有他的生命周期;
如:
当原有的内存被释放,但是内存地址被保留到*p中,而后另外一个函数,
被重新分配到与它对齐大小的数据块,然后*p就可以使用这一块内存。
5.对同一块内存释放多次
int main(void){
char* a=NULL ;
char* b=NULL;
a=(char *)malloc(sizeof(char)*3);
free(a);
b=(char *)malloc(sizeof(char)*3);
free(a);
return 0;
}
6.内存泄漏
这个问题是我最早接触的关于内存的问题,简单来说就是内存没有回收。
实际上可能引出很多问题,如果攻击者可以引用内存分配函数,
而且还没有被释放掉,就可能导致拒绝服务攻击。
还有就是其实堆内存是由操作系统管理的,如果main函数结束之后,堆就会清空
,就以目前的内存来说,这根本就不足以造成很大的影响,
但是如果内存泄漏是发生在一个多次引用的函数中,如dll或者so中,就会造成很大的影响
7.零长度分配
暂时没怎么看懂,但是我了解到零长度数组在struct中的作用,
结束一个带有零长度数组的结构,以允许该数组根据需要动态调整大小.这非常方便,当我想确定我的struct在运行时而不是编译时占用的空间量时,
可以节省大量内存。c99支持,gcc也支持,但是vs不支持