从堆栈和堆中释放内存
Deallocating memory from stack and heap
如何释放为已知大小的数组存储的内存?
下面的代码打印了 4 次 "constructor called!" 但只打印了一次 "Destructor called!" 这是否意味着整个数组的内存已被释放?
class Box
{
public:
Box() {
cout << "Constructor called!" <<endl;
}
~Box() {
cout << "Destructor called!" <<endl;
}
};
int main( )
{
Box myBoxArray[4];
delete myBoxArray; // Delete array
return 0;
}
但是,如果我动态声明 myBoxArray
,如下面的代码所示,析构函数将被调用 4 次。
class Box
{
public:
Box() {
cout << "Constructor called!" <<endl;
}
~Box() {
cout << "Destructor called!" <<endl;
}
};
int main( )
{
Box* myBoxArray = new Box[4];
delete [] myBoxArray; // Delete array
return 0;
}
是否需要取消分配非动态分配的内存或最好将其留给垃圾收集器?
不是有分的问题。你根本无法释放你没有分配的内存。
delete [] myBoxArray; // Delete array
有未定义的行为 (UB),任何事情都可能发生,也可能什么都没有。
你只能delete
你做过new
的事情,你只能delete[]
你做过new[]
的事情。任何违反此规则的行为都会导致程序运行异常。
如何释放为已知大小的数组存储的内存?
下面的代码打印了 4 次 "constructor called!" 但只打印了一次 "Destructor called!" 这是否意味着整个数组的内存已被释放?
class Box
{
public:
Box() {
cout << "Constructor called!" <<endl;
}
~Box() {
cout << "Destructor called!" <<endl;
}
};
int main( )
{
Box myBoxArray[4];
delete myBoxArray; // Delete array
return 0;
}
但是,如果我动态声明 myBoxArray
,如下面的代码所示,析构函数将被调用 4 次。
class Box
{
public:
Box() {
cout << "Constructor called!" <<endl;
}
~Box() {
cout << "Destructor called!" <<endl;
}
};
int main( )
{
Box* myBoxArray = new Box[4];
delete [] myBoxArray; // Delete array
return 0;
}
是否需要取消分配非动态分配的内存或最好将其留给垃圾收集器?
不是有分的问题。你根本无法释放你没有分配的内存。
delete [] myBoxArray; // Delete array
有未定义的行为 (UB),任何事情都可能发生,也可能什么都没有。
你只能delete
你做过new
的事情,你只能delete[]
你做过new[]
的事情。任何违反此规则的行为都会导致程序运行异常。