请查看以下代码
#include <iostream>
using namespace std;
class Memory
{
private:
int *memory;
public:
Memory()
{
memory = new int[3];
for(int i=0;i<3;i++)
{
memory[i] = i;
cout << memory[i] << endl;
}
}
~Memory()
{
delete[] memory;
}
};
int main()
{
cout << "Running" << endl;
Memory m;
// do I have to invoke ~Memory() ?
int *secondMemory = new int[5];
//How to clear the memory of 'secondMemory' ?
system("pause");
return 0;
}
在这里,我已经清除了类的析构函数中动态分配的memory
数组的内存。但我的问题是
这些问题在代码的适当位置作为注释询问。请帮忙!
修改
这里的问题是,如果我在main()中删除'secondMemory'的内存,那么一旦分配内存就会消失!
答案 0 :(得分:8)
我是否必须调用~Memory()?
不,具有自动存储持续时间的对象(如m
)在超出范围时会被销毁。换句话说,析构函数由系统自动调用。在这种情况下,m
从main()
函数返回时会被销毁。
如何清除'secondMemory'的记忆?
必须通过对new
的相应调用销毁分配有delete
的每个对象,并且必须通过对new[]
的相应调用销毁分配有delete[]
的每个数组:
delete[] secondMemory;
如果不这样做会导致内存泄漏。
但是,请记住,使用原始指针执行手动内存管理在Modern C ++中被视为糟糕的编程习惯。而是尽可能使用标准容器,如std::vector<>
。
答案 1 :(得分:4)
我必须调用~Memory()
不,当对象超出范围时,会自动调用析构函数。
如何清除'secondMemory'的记忆?
使用delete[] secondMemory;
答案 2 :(得分:2)
Memory m;
// do I have to invoke ~Memory() ?
这不是动态分配的,因此当m
超出范围时,编译器会为您调用析构函数。在这种情况下main
返回。
int *secondMemory = new int[5];
//How to clear the memory of 'secondMemory' ?
这是动态分配的,因此您必须解除分配。
delete [] secondMemory;
答案 3 :(得分:2)
我是否必须调用~Memory()?
当对象超出范围时,将自动调用~Memory()
。所以不,你不必做任何事情来手动调用它。
如何清除'secondMemory'的记忆?
只需使用
delete [] secondMemory
因为您使用new和[]来初始化int* secondMemory
。