3

我试图确定可以在 C++ 中为变量分配存储的语句。到目前为止,我想出了:

  1. 声明语句:int a;具有各种存储、范围说明符 ( auto, static, global) 的语句。
  2. 表达式语句:
    可以使用 等来分配堆上mallocnew存储。从技术上讲,尽管 的存储pointer是在其声明中分配的。我在这里计算所有此类情况。
    • 右手边的赋值 exprmalloc/new/calloc或被调用函数可能分配存储的函数调用。
    • 函数调用 expr,变量通过引用传递,并在被调用函数中分配存储。

我想不出任何其他方法,但我有一种暗示可能还有更多。我希望人们明白我的要求,即使这个问题的措辞可能不正确。:) 欢迎任何意见。

4

1 回答 1

5

最好的方法是按内存类别对分配语句进行分组:

  1. 静止的
  2. 例外
  3. 线程本地(仅限 C++11)

所有静态分配都来自声明。特别注意类模板实例化。模板中的静态数据字段显示为一个声明,而它们在数据段中生成与该模板的实例一样多的数据字段。函数/方法中的静态对象没有像::Namesp::Class1::Class2::Smth. 类或命名空间中的常规静态对象总是具有这样的名称。

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

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

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

异常与throw语句一起分配。catch当控制退出块时,它们被隐式删除。请注意,如果某些东西被抛出为Some-Class*(即作为指针),那么 C++ 运行时只会破坏指针本身,即它会执行no-op. 在这种情况下,该对象应由用户在 catch 块内的代码删除。否则这将是一个香草memory-leak/

线程局部对象的声明方式与静态对象非常相似。他们只有多个副本。

于 2012-10-14T06:28:05.120 回答