我有一个班级:
class Land{
public:
~Land() { if(map != nullptr) Clean(); }
bool Create();
void PrintMap() const;
void Clean();
private:
int rows = 0, columns = 0;
int **map = nullptr;
bool CorrectDimensions() const;
void CreateMap();
bool FillMap();
};
bool Land::Create() {
//
printf("Matrix size:\n");
if(scanf("%d %d", &(this->columns), &(this->rows) ) != 2 || !CorrectDimensions() )
return false;
CreateMap();
printf("Values:\n");
return FillMap();
}
void Land::CreateMap() {
//
this->map = new int*[rows];
for(int column = 0; column < this->rows; column++)
map[column] = new int[this->columns];
}
bool Land::FillMap() {
//
for(int row = 0; row < this->rows; row++) {
for(int column = 0; column < this->columns; column++) {
if( ! scanf("%d", &(this->map[row][column]) ) ) {
return false;
}
}
}
return true;
}
void Land::Clean() {
//
for(int row = 0; row < this->rows; row++)
delete [] this->map[row];
delete [] this->map;
}
我的司机:
int main() {
//
Land l;
if( ! l.Create() ) {
IncorrectInput();
return 1;
}
l.PrintMap(); //prints correct output
}
我认为我的计划应该如何运作:
false
,从而完成该计划。内存尚未动态分配(保持在nullptr
),没问题。calloc
创建一个二维数组(我知道我将C与C ++混合,想要使用类,而vector
不可用)。< / LI>
Create()
是否过早结束(calloc
之前),我默认将int **map
初始化为nullptr
。如果我分配,map
将不再是nullptr
,并且需要被释放。否则,析构函数应该free
,这就是Clean()
所做的。Clean()
我遵循动态分配和释放的做法。 calloc
和free
遵循其反转模式。调试确认调用了多少calloc
个,调用了许多free
。完成所有这些操作后,valgrind
仍会报告错误(不是reachable
,实际错误)。具体来说:total heap usage: 184 allocs, 23 frees
。是什么导致了这个错误,我错过了什么?
编辑:已初始化的rows
和columns
成员。已使用C ++ calloc()
和new
更改了delete
。
答案 0 :(得分:0)
没有内存泄漏。
calloc
不会抛出异常。
BTW,在Land::CreateMap
和meny其他地方检测到空指针deference。
不要忘记检查calloc
例如,
class foo {
int* p1;
int* p2;
foo()
{
p1 = new int;
p2 = new int;
}
~foo()
{
delete p1;
delete p2;
}
};
int main()
{
foo val;
}
在foo
的Ctor中,当p2 = new int;
抛出异常时,foo
的Dtor将不会调用,因此,任何人都可以删除p1
!
因此,当您想在ctor中使用非noexcept运算符new
分配内存时,必须使用RAII包装器。 C ++ 11或更高版本具有RAII wapper类来分配内存,即std::unique_ptr
或std::shared_ptr
。
BTW,
矢量不可用
您使用的环境是什么?