关于结构体内存分配及释放
2010-04-15 12:21
411 查看
struct mybuf{
int size;
char buffer[1];
}
为什么要这样定义结构?char[1]只能放/0,如何放数据
再看使用
bufsize=1024;
struct mybuf *mbuf = (struct mybuf *)malloc(sizeof(struct mybuf)+ bufsize +1);
strcpy(mbuf.buffer, "this is test");
[问题]这样做是不是会数组越界,另外在释放此空间的时候,因为是结构体指针,如果按结构体空间释放,那岂不是内存泄漏?
过去做C的时候也这么写过,特别是在操作消息队列时经常这么用,这么做可以扩展结构体中缓冲区buffer的大小
如你的代码,实际buffer分配的是1024,只在使用的时候才动态分配,而只保留结构体的指针,释放时只需释放结构体指针就可以了
另外解析一下这样做为什么不会内存泄漏
首先要了解malloc/free的机制
malloc其实分配了比你申请的大小更大一点的空间,那这大出来的是做什么的呢,是用来存放分配内存块的信息,包括了空间大小信息,而free是怎么做的呢,它先根据你传入的指针,计算出块的实际首地址,通过(-sizeof(块信息结构))得到的,把块的状态置为可用,这就是free的简单过程,那么你就明白,分配的时候是按malloc函数参数的申请大小,不是结构体的大小,那么在释放的时候就是释放malloc分配的大小了,而不是结构体的大小
http://topic.csdn.net/u/20081112/19/b68dd9ef-0825-4570-9d68-9351c1d8c85d.html
int size;
char buffer[1];
}
为什么要这样定义结构?char[1]只能放/0,如何放数据
再看使用
bufsize=1024;
struct mybuf *mbuf = (struct mybuf *)malloc(sizeof(struct mybuf)+ bufsize +1);
strcpy(mbuf.buffer, "this is test");
[问题]这样做是不是会数组越界,另外在释放此空间的时候,因为是结构体指针,如果按结构体空间释放,那岂不是内存泄漏?
过去做C的时候也这么写过,特别是在操作消息队列时经常这么用,这么做可以扩展结构体中缓冲区buffer的大小
如你的代码,实际buffer分配的是1024,只在使用的时候才动态分配,而只保留结构体的指针,释放时只需释放结构体指针就可以了
另外解析一下这样做为什么不会内存泄漏
首先要了解malloc/free的机制
malloc其实分配了比你申请的大小更大一点的空间,那这大出来的是做什么的呢,是用来存放分配内存块的信息,包括了空间大小信息,而free是怎么做的呢,它先根据你传入的指针,计算出块的实际首地址,通过(-sizeof(块信息结构))得到的,把块的状态置为可用,这就是free的简单过程,那么你就明白,分配的时候是按malloc函数参数的申请大小,不是结构体的大小,那么在释放的时候就是释放malloc分配的大小了,而不是结构体的大小
http://topic.csdn.net/u/20081112/19/b68dd9ef-0825-4570-9d68-9351c1d8c85d.html
相关文章推荐
- 关于C++中结构体及其指针成员的内存分配和释放
- 关于结构体的内存分配问题--sizeof(/*struct*/A)
- 关于C/C++中内存分配与释放的疑惑?
- 结构体指针数组 内存分配 释放
- 结构体和共用体关于内存的分配问题
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
- 关于struct结构体内存分配的学习小结
- 关于内存分配与释放的解析
- 在对结构体分配的内存进行free时出现,关于 Windows 已在 **.exe 中触发一个断点。其原因可能是堆被损坏.
- 关于C结构体内存分配
- 结构体和共用体关于内存的分配问题
- 关于内存分配与释放的试验
- 结构体中的内存分配--struct dirent中引起的问题
- vector 避免内存频繁分配释放与手动释放vector内存
- 赋值字符串时关于内存值的变化及释放
- .NET Framework 的垃圾回收器管理应用程序的内存分配和释放
- C关于内存分配的错误解析
- C语言中内存的动态分配与释放(多维动态数组构建)
- C和C++中动态分配和释放内存的方式及其区别
- STL vector (一)——扩容原理与内存分配与释放