当尝试尽可能减少内存使用时,我看到一些程序使用其他本地范围。这是减少足迹的最佳方法吗?当括号关闭时,是否会从堆栈中删除变量?明确delete
对象会更好吗,还是同样好?或者编译器会删除多余的括号?
void foo()
{
{
int a = 4;
BigObject obj1;
obj1.operations(a);
}
{
double b = 9;
BigObject obj2;
obj2.operations(b);
}
}
答案 0 :(得分:5)
是的,他们引入了新的范围。具有自动存储持续时间的对象,即堆栈中的对象("局部变量")将会消失范围的最后范围。
您可以保证调用析构函数,但不能保证对象实际上是从堆栈中删除的(因为 stack 是一个实现细节 - 标准只涉及自动存储持续时间)
然而,这样做的表现很少。相反,它在使用RAII pattern时非常有用。
但请注意,仅适用于本地变量。动态分配的内存,即堆上的对象(使用new
分配的), not 将被释放,直到您明确delete
它们为止。
指针必须指向动态分配的内存。 C ++清楚地区分了pointer to BigObject
和BigObject
的概念。换句话说,你的程序是不正确的。你应该写:
BigObject* obj1 = new BigObject();
// ^-- Important!
您不能使用自动存储delete
变量,因此您的部分问题没有意义。
而不是使用new
,而不是使用std::unique_ptr
代替:
std::unique_ptr<BigObject> obj1 = make_unique<BigObject>();
当BigObject
超出范围时,为obj1
分配的内存将自动释放 - 这是RAII模式。
答案 1 :(得分:-1)
我过去曾经考虑过这个问题,但事实上,根据我讨厌的实验,它实际上并没有节省空间。本地人似乎仍然在筹码上连续存货:
int _tmain(int argc, _TCHAR* argv[])
{
int* nasty = NULL;
{
int value = 1;
std::cout << &value << std::endl;
}
{
int value2 = 2;
std::cout << &value2 << std::endl;
}
{
int value3 = 3;
std::cout << &value3 << std::endl;
nasty = &value3;
}
std::cout << nasty[0] << ", " << nasty[3] << ", " << nasty[6] << std::endl;
return 0;
}
输出:
001FFC38
001FFC2C
001FFC20
3, 2, 1