美文网首页
库开发应使用二维指针数组

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

作者: Brent姜 | 来源:发表于2018-01-09 11:57 被阅读9次

    起源:

    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);
    }
    

    相关文章

      网友评论

          本文标题:库开发应使用二维指针数组

          本文链接:https://www.haomeiwen.com/subject/lfpwnxtx.html