2016-05-13 29 views
-3

我對C++很新手。我想創建執行壓縮行存儲矩陣操作的命名空間,但是遇到了一個錯誤: terminate called after throwing an instance of 'std::bad_alloc' 下面是我的代碼在頭文件:一個類的C++分配

namespace matrixOperation 
{ 
    class SparseMatrix 
    { 
    public: 
    SparseMatrix(){ 
    } 
    size_t nrow, ncol, nnz; 
    vector<size_t> ia, ja; 
    vector<double> a; 
    ~SparseMatrix(){ 
    } 
    }; // end of SparseMatrix class*/ 

    typedef SparseMatrix CSR; 
    typedef SparseMatrix csr_p; 

    inline void alloc_csr(size_t nrow, size_t ncol, size_t nnz, CSR *pt) 
    { 
    pt = new CSR(); // this is where I think the bug occurs 
    pt->nrow = nrow; 
    pt->ncol = ncol; 
    pt->nnz = nnz; 
    pt->ia.resize(nrow+1); 
    pt->ja.resize(nnz); 
    pt->a.resize(nnz); 
    return; 
    } 
} //end of namespace 

感謝您的幫助!

+1

我們需要一個[mcve] – NathanOliver

+1

不直接相關,但是'alloc_csr'函數更適合作爲SparseMatrix類的構造函數。在'void'函數結束時,你不必寫'return;';這是隱含的。 – Wyzard

+0

回聲納森的評論:請也顯示對'alloc_csr'的調用(包括用作參數的值)。由於你是C++新手,你可能想看看我們的[C++書籍清單](http://stackoverflow.com/q/388242/1782465)。 – Angew

回答

0

bad_alloc當程序試圖分配更多的內存而不是系統可用時拋出。您的new CSR()調用不應該這樣做,因爲對象只有幾個字段,並且在構建時不會執行任何大內存分配,但如果請求的大小很大,resize調用就可以完成。

2

std::bad_alloc當沒有足夠的內存分配動態內存時拋出,但你的代碼看起來相當不錯,可能你傳遞了太大的nrow,ncol,nnz值。也許你偶然會傳遞負值,在轉換爲無符號類型之後(如size_t)非常大。

你確實有內存泄漏,因爲pt不返回分配CSR實例的參數,返回它,你需要一個參考:

inline void alloc_csr(size_t nrow, size_t ncol, size_t nnz, CSR *&pt) 
                   ^~~~~ 

左右後,您可以:

matrixOperation::CSR* pcsr; 
matrixOperation::alloc_csr(10, 10, 10, pcsr); 
// use pcsr 
delete pcsr;