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里面查找,你会在某个地方找到这个字符串。它将代码存储在一起,并将代码一起加载到内存中。此内存不能“释放”或“释放”,尽管您可以更改它。此内存不是堆栈或堆,但实际上它通常位于堆之前。