限制C ++变量的范围

时间:2012-05-08 18:33:22

标签: c++ scope

我有一个C ++程序,其格式如下:

int main(){
    int answer;

    ...

    MEMORY_CONSUMING_DATA_ARRAY temp;
    a few operations on the above;
    answer=result of these operations;

    ... //More code
}

也就是说,我有一小段代码似乎不保证自己的功能,但它使用了大量的内存。

我想让耗尽内存的变量(一个类)在有限的范围内存在以产生结果,然后将其销毁。辅助函数可以很容易地做到这一点,但在我正在工作的场景中似乎过度杀戮。

关于如何做到这一点的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:13)

如果您需要破坏:

int main() {
    int answer;

    ...
    { // << added braces
      MEMORY_CONSUMING_DATA_ARRAY temp;
      a few operations on the above;
      answer=result of these operations;
    }
    ... //More code
}

因此适用于动态分配支持的集合/对象,例如std::vector

但是对于大堆栈分配......你是编译器的怜悯。编译器可能会决定在函数返回后清理堆栈,或者可以在函数内逐步执行清理。当我说清理时,我指的是你的功能需要的堆栈分配 - 而不是破坏。

要扩展此:

破坏动态分配:

int main() {
    int answer;
    ...
    { // << added braces
      std::vector<char> temp(BigNumber);
      a few operations on the above;
      answer=result of these operations;
      // temp's destructor is called, and the allocation
      // required for its elements returned
    }
    ... //More code
}

与堆栈分配:

int main() {
    int answer;
    ...
    {
      char temp[BigNumber];
      a few operations on the above;
      answer=result of these operations;
    }

    // whether the region used by `temp` is reused
    // before the function returns is not specified
    // by the language. it may or may not, depending
    // on the compiler, targeted architecture or
    // optimization level.

    ... //More code
}

答案 1 :(得分:3)

贾斯汀的回答很好,但如果你一次又一次地执行这个操作,那么你可能想重复使用这个记忆。

修改

正如所指出的那样静态会使内存不在堆栈上分配,这可能对你有利,如果你每次都需要将内存归零,如果你每次都要复制相同的数量,那么它也是可选的。要读过这一点,那么你可以保存对零编号或其他初始化调用的调用。

int main(){
    int answer;

    ...

    {
      static MEMORY_CONSUMING_DATA_ARRAY temp; // make this static or a member perhaps
      temp = 0; // initialise it every time to clear the memory or zeromemory or other op
      a few operations on the above;
      answer=result of these operations;
    }
    ... //More code
}