2013-03-15 108 views
-1

我在這樣簡單的代碼中有相當奇怪的行爲。 只要有一個模板類,副本的指針:免費()無效指針C++

template <typename T_out, typename Class_type, typename T_in> class C_Ololo{ 
     public: 
     T_out (Class_type::*cxfunc) (T_in); 
     Class_type * obj_ref; 
     T_out getRef(T_out (Class_type::*func2) (T_in), Class_type * __obj) 
     { 
      cout << "GetRef in...1" << endl; 
      cxfunc=func2;  // Segmentation fault 
      cout << "GetRef in...2" << endl; 
      obj_ref=__obj; // Segmentation fault 
     } 
    }; 

然後只是一些裸露類調用前一個:

class C_Temp{ 
    public: 
    dcxArray1D /* double */ func (double a){ 
     dcxArray1D /* double */ temp(1); 
     return temp; 
    } 

    void getResult(){ 
     cout << "GetResult" << endl; 
     C_Ololo <dcxArray1D /* double */ ,C_Temp,double> * ololo; 
     ololo = new C_Ololo<dcxArray1D /* double */ ,C_Temp,double>(); 
     ololo->getRef(&C_Temp::func,this); 
    } 
}; 

哪裏dcxArray1D就是:

typedef vector< complex<double> > dcxArray1D; 

所以 - 的問題是當我使用double,我現在有dcxArray1D,我沒有任何問題。但是,一旦我使用dcxArray1D我有「分段錯誤」和free():第一類中的無效指針。

你能幫一點......

+2

'__obj'是一個無效的名字(保留用於實現) – MSalters 2013-03-15 14:28:06

+2

就像一個提示,而不是使用函數指針,你可能想了解更多關於['std :: function'](http://en.cppreference。 com/w/cpp/utility/functional/function)(和['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind))。 – 2013-03-15 14:29:16

+1

小心向我們展示這是*使用*?可能是你正在破壞堆*或附近。正如所寫的,所有這些都佔用了源文件中的空間。 – WhozCraig 2013-03-15 14:32:35

回答

0

有在代碼中free沒有呼叫你展示。也沒有電話malloc。這完全相當可疑。根本原因幾乎可以肯定的是,您在撥打free的東西時未分配到malloc

爲什麼你甚至使用這種原始功能?如果你堅持使用標準的C++功能,整個問題可能會立即消失。

+0

我不叫'免費' - 我只有這個頭和main.cpp兩行 'C_Temp temp; temp.getResult();' 這是什麼意思_primitive functions_和_standard C++功能_在這種情況下? – stkubr 2013-03-15 14:35:46