-1

我有以下代码和简单的 if 语句:if (voxels_)where voxels_ should be NULL 失败。编码:

template<class T, typename REAL = float>
class NDIMVoxelStructure
{
public:
    inline NDIMVoxelStructure (): voxels_(NULL){}
    inline virtual ~NDIMVoxelStructure (){ this->clear();}

    /////////////////ERROR occurs at if(voxels_) //////////////////
    inline void 
    clear (){if ( voxels_ ){delete[] voxels_; voxels_ = NULL;}} 


    inline void
    build (const std::vector<REAL> bounds, std::vector<int> num_of_voxels) {
        this->clear();
        // more code
    }

protected:
    T* voxels_;
};

Class ModelLibrary {

    ModelLibrary () {
        hash_table_.build (bounds_vector, num_of_cells_vector);
    }

    struct Quad{
            const ORROctree::Node::Data* first;
            const ORROctree::Node::Data* second;
            const float* f1;
            const float* f2;
    };

    typedef std::list<Quad > quad_list;
    // these two types hide base class types
    typedef std::map<const Model*, quad_list> HashTableCell; 
    typedef NDIMVoxelStructure<HashTableCell, float> HashTable;

protected:
    HashTable hash_table;
};

int main() {
    ModelLibrary library; 
}

我在 clear() 方法中遇到了段错误。使用 gdb 我得到的地址voxels_设置为0xa很奇怪。我将它初始化为NULL,所以if (voxels_)应该简单地返回false。任何想法都会有所帮助。这真让我抓狂

4

1 回答 1

1

考虑到这只是真实代码的“微型”版本。是不是您的实际代码正在调用NDIMVoxelStructure的复制构造函数(例如,通过返回NDIMVoxelStructure元素的函数),然后voxels_没有正确初始化?

在以前的情况下,如果voxels_是一个指针,默认的复制构造函数最初会吞下复制 NULL 值,但可能还有其他东西可以在幕后运行。

我建议还定义NDIMVoxelStructure' 复制构造函数并检查它是否被调用。

于 2013-11-12T07:01:48.330 回答