类的C++分配
C++ allocation of a class
我是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
谢谢你的帮助!
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;
bad_alloc
在程序试图分配的内存超过系统可用内存时抛出。new CSR()
调用不应该这样做,因为对象只有几个字段,并且在构造时不进行任何大的内存分配,但如果请求的大小很大,resize
调用可以这样做。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源