我是C ++的新手,我的内存管理存在问题。
我有一个函数a()
,它调用3个函数(b()
,c()
,d()
),每个函数返回一个动态分配的{{1}数组对象:
MyClass
在void a(){
MyClass * one=b();
MyClass * two=c();
MyClass * three=d();
//operate with 3 array (one, two and three)
delete [] one;
delete [] two;
delete [] three;
}
MyClass * b(){
MyClass * array=new MyClass[2000];
//many operations on array
return array;
}
MyClass * c(){
MyClass * array=new MyClass[2000];
//many operations on array
return array;
}
MyClass * d(){
MyClass * array=new MyClass[2000];
//many operations on array
return array;
}
中进行多次操作后,我必须删除使用3个函数创建的3个数组。如果我使用上面代码中的3个a()
表达式来表达,那可以吗?
我问自己这个问题,因为我认为这段代码正确地释放了所有内容,但是分析了我的c ++程序的内存分配,我没有看到这种删除的证据。
答案 0 :(得分:5)
为了可靠的内存管理,您应该使用智能指针,例如std::unique_ptr
。因此,当您的函数返回动态分配的值时,它应该将std::unique_ptr
返回到该值,以确保将释放此值。
std::unique_ptr<MyClass[]> array(new MyClass[2000]);
在您的情况下,您应该考虑使用std::vector
而不是原始数组。
答案 1 :(得分:3)
是的,你正在做的是正确的。
但请注意,手动内存管理容易出现错误,无论是内存泄漏还是双重删除。忘记裸new
,特别是delete
更好 ,而是使用RAII类来安全地处理它。
在您的情况下,您应该使用std::vector
替换指向动态分配的数组的指针。 std::vector
是 在C ++中拼写“动态分配的数组”的方法。一旦你这样做,你就会知道即使存在异常,向量也会正确地释放内存。
这是std::vector
代码的代码:
void a(){
auto one=b();
auto two=c();
auto three=d();
//operate with 3 array (one, two and three)
//nothing to do here, the vectors will deallocate memory correctly when they go out of scope
}
std::vector<MyClass> b(){
std::vector<MyClass> array(2000);
//many operations on array
return array;
}
std::vector<MyClass> c(){
std::vector<MyClass> array(2000);
//many operations on array
return array;
}
std::vector<MyClass> d(){
std::vector<MyClass> array(2000);
//many operations on array
return array;
}
至于为什么你看不到解除分配的影响:delete
释放的内存不需要立即返回给操作系统。通常,C ++运行时将保留它并使用它来满足程序的未来分配要求。