我试图确定可以在C++中为变量分配存储的语句。到目前为止,我已经想出了:
- 声明语句:像
int a;
这样的语句,具有各种存储、范围说明符(auto
、static
、global
) - 表达式语句:
堆上的存储可以使用malloc
、new
等进行分配。从技术上讲,尽管pointer
的存储是在其声明中分配的。我在这里数所有这样的案件。- 右侧为
malloc/new/calloc
的Assignment expr或被调用函数可能分配存储的函数调用 - 函数调用expr,该变量通过引用传递,并在被调用函数中分配存储
- 右侧为
我想不出任何其他方法,但我有一点预感,可能还有更多。我希望人们知道我在问什么,即使这个问题的措辞可能不正确。:)欢迎任何意见。
最好的方法是按内存类对分配语句进行分组:
- 静态
- 堆栈
- 堆
- 例外情况
- 线程本地(仅限C++11)
所有静态分配都来自声明。特别注意类模板的实例化。模板中的静态数据字段显示为一个声明,而它们在数据段中生成的数据字段数量与此模板的实例化数量一样多。函数/方法中的静态对象没有像::Namesp::Class1::Class2::Smth
那样的全局名称。类或命名空间中的常规静态对象总是具有这样的名称。
堆栈分配来自函数的局部变量和参数的声明。当一些东西被传递到函数(ref、ptr、val等)中时,最好将其作为根据参数声明创建的东西来威胁,而不是动态生成的东西。
此外,在计算表达式期间以及从函数/方法返回某些内容时,还存在临时变量。它们都是堆栈分配。
堆分配总是显式的。它们是用malloc(或它的一种口味)创造的,无论是新的还是新的[]。
使用throw
语句分配异常。当控制退出catch
块时,它们被隐含地删除。请注意,如果某个东西被抛出为Some-Class*
(即作为指针),那么C++运行时将只销毁指针本身,也就是说,它将执行no-op
。在这种情况下,catch块内的用户代码应该删除该对象。否则,这将是一个香草memory-leak
/
线程本地对象的声明方式与静态对象非常相似。它们只有多个副本。