我是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
感谢您的帮助!
答案 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()
调用可以执行此操作要求的规模是巨大的。