2012-10-14 28 views
3

我试图确定哪些语句可以在C++中分配一个变量。到现在为止,我已经想出:C++中的存储分配语句

  1. 声明语句:像int a;与各种存储,范围符(autostaticglobal)语句。
  2. 表达式语句:
    存储上堆可以使用mallocnew等虽然在技术上为pointer存储在其声明中被分配来分配。我在这里计算所有这种情况。
    • 赋值expr的右边是malloc/new/calloc或函数调用,其中被调用的函数可能会分配存储。
    • 函数调用expr,该变量通过引用传递,并在被调用函数中分配存储。

我无法想到的任何其他方式,但我有一个暗示,有可能是更多的。我希望人们能够了解我所要求的内容,即使这个问题可能不是正确的。 :) 欢迎任何输入。

回答

5

的最佳方法是对组分配的语句由类的存储器:

  1. 静态
  2. 堆栈
  3. 例外
  4. 线程本地(C++ 11只)

所有静态分配来自声明。特别注意类模板实例化。模板中的静态数据字段显示为一个声明,但它们会在数据段中生成尽可能多的数据字段,因为此模板有实例。函数/方法中的静态对象不具有像::Namesp::Class1::Class2::Smth这样的全局名称。类或名称空间中的常规静态对象始终具有这样的名称。

堆栈分配来自函数的局部变量和参数的声明。当某些东西传入函数(ref,ptr,val等)时,最好将它作为根据参数声明创建的东西,而不是动态生成的东西。

除此之外,在计算表达式和从函数/方法返回某些内容时存在临时变量。他们都是堆栈分配。

堆分配总是显式的。它们是用malloc(或其中一种风格),新的或新的[]创建的。

异常分配为throw声明。当控制权退出catch块时,它们被暗中删除。请注意,如果抛出的东西是Some-Class*(即作为指针),那么C++运行时将仅销毁指针本身,即它会执行no-op。这个对象应该被catch块内用户的代码删除这种情况。否则,这将是一个香草memory-leak/

线程本地对象的声明方式非常类似于静态。他们只有多个副本。

+0

'malloc'或'calloc'。 –

+0

@Jerry:对,malloc或其中一种口味。不同的系统有不同的别名。 –

+0

感谢您的回复@KirillKobelev。我实际上正在编写一个编译器通行证,收集所有'分配给它的一个用途的变量。该通道执行上下文不敏感,过程间,向后“到达分配”数据流分析。因此我想查看所有可能分配变量的语句。我现在忽略模板,例外和临时变量,以保持简单。感谢您指出这些! – Nilesh