库开发应使用二维指针数组
2018-01-09 本文已影响9人
Brent姜
起源:
TFZQ的 HDF5 库,读取一个文件的函数中,需要传入一个buffer,是一个一维指针,形如:
HDF5GetData(int& num, void* buffer);
而同事在使用该库的时候,是首先将数据读取出来,放到一个Queue中,然后另一个线程读取这个Queue然后解析数据。形如:
// 数据读取函数:
void reader()
{
T buffer[MAX_LEN];
int num;
HDF5GetData(num, buffer);
for(int i=0; i<num; ++i){
queue_.push(&buffer[i]);
}
}
// 数据处理函数:
void processor()
{
do{
T* item = queue_.pop();
// handle item data
// ...
}while(true);
}
这样的程序会导致异常。我帮助解决了问题,解决代码如下:
// 数据读取函数:
void reader()
{
T buffer[MAX_LEN]; // <-- first memory allocation
int num;
HDF5GetData(num, buffer);
for(int i=0; i<num; ++i){
auto newitem = new T();
memcpy(newitem, &buffer[i], sizeof(T)); // <-- create a new buffer! 2nd memory allocation
queue_.push(newitem); // <-- use it!
}
}
// 数据处理函数:
void processor()
{
do{
T* item = queue_.pop();
// handle item data
// ...
delete item; // <-- delete
}while(true);
}
这样的话等于是对同一个对象进行了两次内存分配操作。
如果HDF5GetData改为如下的形式:
HDF5GetData(int& num, void** buffer);
这样的话,就可以在HDF5库中分配好指向指针的数组。
// 数据读取函数:
void reader()
{
T* buffer[MAX_LEN];
int num;
HDF5GetData(num, &buffer); // <-- first and only once memory allocation
for(int i=0; i<num; ++i){
queue_.push(buffer[i]); // <-- use it!
}
}
// 数据处理函数:
void processor()
{
do{
T* item = queue_.pop();
// handle item data
// ...
delete item; // <-- delete
}while(true);
}