2013-11-11 3 views
-1

У меня есть следующий фрагмент кода и простой оператор if: if (voxels_), где voxels_ должен быть 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; 
} 

Я получаю segfault в методе clear(). Используя gdb, я получил адрес voxels_, который установлен в 0xa, что странно. Я инициализирую его NULL, поэтому if (voxels_) должен просто вернуть false. Любые идеи были бы полезны. Это сводит меня с ума

+2

Вы пытаетесь получить доступ к объекту NDIMVoxelStructure, удаленному aleady, возможно, в некотором коде, который вы не указали. –

+3

Прочтите это: [C++: правило трех] (http://en.wikipedia.org/wiki/Rule_of_three_ (программирование на C++ _)) – WhozCraig

+2

Этот вопрос требует минимального жизнеспособного примера для ответа. Ваш пример скомпилировал и произвел ошибку? – JimR

ответ

1

Принимая во внимание, что это всего лишь «миниатюрная» версия от реального кода. Может быть, ваш фактический код вызывает конструктор копий NDIMVoxelStructure (например, через функцию, которая возвращает элемент NDIMVoxelStructure), а затем voxels_ неправильно инициализирован?

В предыдущей ситуации, если voxels_ является указателем, конструктор копирования по умолчанию, первоначально, проглотит копию значения NULL, но, возможно, что-то еще может быть запущено за кулисами.

Я бы предложил также определить конструктор копии NDIMVoxelStructure и проверить, вызвано ли оно.

Смежные вопросы