库开发应使用二维指针数组

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);
}
上一篇下一篇

猜你喜欢

热点阅读