【问题标题】:Where does the member variable inside a class allocated?类中的成员变量在哪里分配?
【发布时间】:2012-07-05 11:03:58
【问题描述】:

我有课

class Sample
{
   string strName;
};

如果我使用Sample *obj = new Sample() 为示例创建一个对象@ 字符串strName 在哪里创建?它是在堆栈中还是在堆中?

【问题讨论】:

  • C++ 标准没有定义“堆栈”和“堆”,所以理论上它取决于编译器,只要保留生命周期语义。此外,std::string 可以将其实际数据保存在任何它想要的地方。

标签: c++


【解决方案1】:

无处可去,因为Sample obj = new Sample() 不会编译。

如果您的意思是Sample* obj = new Sample(),那么它在动态存储(堆)中。

当你调用delete obj时,字符串会被自动删除,即使它在堆上。

【讨论】:

    【解决方案2】:

    整个 og obj 在“堆”上,它的数据成员也是。但是,您不必担心管理分配给数据成员的内存。删除 obj 也会处理该字符串。

    【讨论】:

      【解决方案3】:

      strName 将放置在您的 Sample 对象所在的位置。但是,string 类可以在后台寻址它喜欢的任何存储,是否使用普通变量(然后再次将它们放置在放置 string 的位置,指向某些东西的指针,内存映射,一直只是查询 XML地球另一端的接口。

      但是,string 必须以某种方式存储地址,例如它的指针或引用或 url 或任何使用的寻址方案都放置在放置 string 的位置。


      相关经验法则:指针本身就是值(这就是为什么在对象复制情况下很难正确处理)。

      【讨论】:

        【解决方案4】:

        结构体、数组、指针和基本数值类型将在分配类的任何位置与类一起创建。

        字符串更复杂。它们是一种容器。定义容器的字符串成员将作为示例类中的成员存储在类的内存块中。字符串的文本可能会分配到堆上的其他地方(取决于字符串类的实现)。

        现在,如果您执行Sample* blah = new Sample();,则 operator new 将在堆中分配内存(指针将在堆栈上,如果它最初是堆上某个类的成员,则在堆上)。
        如果只是作为变量使用,会入栈:Sample blah;

        【讨论】:

        • 现在,如果你做 Sample blah = new Sample();然后 operator new 将在堆中分配内存(指针将在堆栈上)。* 如果指针是在堆本身上创建的类的成员,则不会! 堆接收
        • 正确。补充说。尝试彻底时很难考虑每个示例:)
        猜你喜欢
        • 2011-03-23
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多