C/C++中分配内存主要使用的就是mallc和new,但是如果随意申请内存,就无法做到自动回收。所以在Obotcha中,使用了一个ByteArray的类来管理内存。申请一段内存可以使用直接调用createByteArray(int size)接口来获取。ByteArray构造函数内部处理如下:
_ByteArray::_ByteArray(int length) {
buff = (char *)malloc(length);
memset(buff,0,length);
_size = length;
}
实际上就是一个malloc处理,同时标记了这块内存的大小。内存的copy也可以通过copy构造函数来实现:
_ByteArray::_ByteArray(sp<_ByteArray> b) {
buff = (char *)malloc(b->size());
memcpy(buff,b->toValue(),b->size());
}
ByteArray也可以调用resize来扩大内存
bool _ByteArray::resize(int size) {
if(size <= _size) {
return false;
}
char *toFree = buff;
buff = (char *)malloc(size);
memset(buff,0,size);
memcpy(buff,toFree,_size);
_size = size;
if(toFree != nullptr) {
free(toFree);
}
return true;
}
Obotcha中,所有申请的内存块都会以ByteArray来存放。例如FileOutputStream的写操作:
bool _FileOutputStream::write(ByteArray buff,long size) {
char *p = buff->toValue();
printf("write %s,size is %d \n",p,buff->size());
fstream.write(buff->toValue(),size);
return true;
}
PS:用过QT的同学可能会觉得这个和QByteArray很像。哈哈,的确,ByteArray的设计就是参考QByteArray来做的。
ByteArray代码如下:
https://github.com/wangsun1983/Obotcha/blob/master/lang/ByteArray.cpp