C ++分配一个类

时间:2016-05-13 15:44:48

标签: c++ dynamic-memory-allocation

我是C ++的新手。我想创建一个执行压缩行存储矩阵操作的命名空间,但遇到错误: terminate called after throwing an instance of 'std::bad_alloc' 下面是头文件中的代码:

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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

当程序试图分配比系统可用内存更多的内存时,抛出

SELECT ISNULL(field1, "Empty") AS field1, ISNULL(field2, "Empty") AS field 2 FROM TableName 。您的bad_alloc调用不应该这样做,因为该对象只有几个字段,并且在构建时不会进行任何大内存分配,但new CSR()调用可以执行此操作要求的规模是巨大的。