C++ 类(包括结构和动态变量)存储在哪里?

C++ 类(包括结构和动态变量)存储在哪里?,c++,struct,C++,Struct,假设我有以下课程: class message { private: HeaderType header; // Message text byte * text; public: message(int ID,struct in_addr senderIP); ~message(); HeaderType getHeader(); byte * getTex

假设我有以下课程:

class message
{
    private:
        HeaderType header;
        // Message text
        byte * text;    

    public:
        message(int ID,struct in_addr senderIP);
        ~message();
        HeaderType getHeader();
        byte * getText();
};
其中HeaderType是一个结构,如下所示:

typedef struct {
    int mID;
    struct in_addr mIP;
}HeaderType;
类(包括结构和动态变量)存储在哪里(堆栈、堆

另外,我将
消息m
声明为静态变量

类存储在堆栈中,而结构在空闲存储中分配

这完全不对。除了默认情况下
struct
成员是
public
,默认情况下
class
成员是
private
之外,它们是相同的

内存分配的位置完全取决于您对对象的实例化

Foo a;             // instantiated on the stack
Foo b* = new Foo;  // on the heap
不管上面的
Foo
struct
还是
class
,它们的行为方式都是一样的

在您的示例中,成员
byte*text将与您的类一起分配。更明确地说,如果您在堆栈上实例化
消息
,则将在堆栈上分配
文本
;如果在堆上实例化
消息
,将在堆上分配
文本

也就是说,指向的对象的位置不必与指针位于同一位置。比如说

int* x;               // This is a pointer declared on the stack

int a = 5;            // This is an int declared on the stack
int* b = new int(5);  // This is an int declared on the heap

x = &a;       // pointing to a stack object
x = b;        // pointing to a heap object
x = nullptr;  // pointing to nothing!

因此,您可以看到实际指针的内存与所指向对象的内存是不相关的。事实上,在最后一行中,指针是实例化的,但指向
nullptr

,指向您更正的问题:

消息的静态实例将位于数据段。每个非指针成员(包括
HeaderType
的成员)的内存在编译时保留。在程序开始时,将调用
消息
头类型
的构造函数,以初始化该内存


如果
消息
的构造将为
字节*文本
分配内存,则该内存将处于堆中。

类和结构相同,存储方式相同。如果您只是在代码中声明它们,它们位于堆栈中:
classobj;结构n(10)。如果在堆中创建它们,它们位于堆中:
Class*obj=newclass();结构*n=新结构(10)
class
es和
struct
s不存储在堆栈或堆上,类和结构的对象或实例在堆栈或堆上分配取决于您如何分配它们。谢谢@MarkShevchenko。你说得对。谢谢@concept3d。你说得对。请大家注意,我知道我知道一般情况下,它们是根据其情况(动态或静态)分配的。我的问题是关于静态类中的动态变量我的问题是什么,这个类在哪里包含动态变量?这些变量会发生什么情况?@Moi类不包含“动态变量”。它包含一个成员
文本
。该成员存储在类存储的位置(如果对象是在自动内存或动态内存中分配的)。它指向什么还取决于它是如何创建的-你可以在Automatic存储(堆栈)中有一个指向变量的指针(即
inta;int*x=&a
-这里
a
x
都在堆栈上)谢谢@LuchianGrigore。“Foo a;//在堆栈上实例化”-如果在函数中,则为true,但是,如果该变量出现在全局或命名空间范围内,则该变量将位于初始化或未初始化数据的另一个区域(取决于构造对象、优化程序、链接器和加载程序的按位表示的组合)。@Moi:有几个人已经解释过这一点,但我也有一个漏洞。指针值本身实际上是一个数字,可用于将基于0的字节数存储到虚拟内存中,其中存储了一些其他有用的数据(实际的文本数据)。因此,指针可能是1234,而在地址1234处会出现“hello\n”。指针的存在根本不能说明它是否指向任何东西,更不用说使用什么分配方法来获取它指向的内存了。因此,文本也可以是堆栈、堆、未初始化或初始化的数据段……是的,构造函数包括text=(byte*)malloc(10);memset(文本“,”,10);所以,您的意思是消息在堆栈中分配,而文本在堆中分配。对吧?差不多了。静态数据不存储在堆栈中,而是存储在堆之前的数据段中。假设您有以下字符串:
staticchars[]=“somestring\n”。如果你在你的.exe里面查找,你会在某个地方找到这个字符串。它将代码存储在一起,并将代码一起加载到内存中。此内存不能“释放”或“释放”,尽管您可以更改它。此内存不是堆栈或堆,但实际上它通常位于堆之前。