C++ 类中的成员变量在哪里分配?

C++ 类中的成员变量在哪里分配?,c++,C++,我有一节课 class Sample { string strName; }; 如果我使用Sample*obj=new Sample()为样本创建对象,字符串strName在哪里创建?它是在堆栈中还是在堆中?哪里都没有,因为Sample obj=new Sample()不会编译 如果您的意思是Sample*obj=newsample(),那么它位于动态存储(heap)中 调用delete obj时,字符串将自动删除,即使它在堆上。无处可去,因为Sample obj=new Sample(

我有一节课

class Sample
{
   string strName;
};

如果我使用
Sample*obj=new Sample()
为样本创建对象,字符串
strName
在哪里创建?它是在堆栈中还是在堆中?

哪里都没有,因为
Sample obj=new Sample()
不会编译

如果您的意思是
Sample*obj=newsample()
,那么它位于动态存储(heap)中


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

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

如果您的意思是
Sample*obj=newsample()
,那么它位于动态存储(heap)中


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

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

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

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

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

现在,如果您执行
Sample*blah=newsample()然后运算符new将在堆中分配内存(指针将位于堆栈上,如果它最初是堆上某个类的成员,则位于堆上)。

如果只是将其用作变量,它将存储在堆栈上:
Sample blah

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

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

现在,如果您执行
Sample*blah=newsample()然后运算符new将在堆中分配内存(指针将位于堆栈上,如果它最初是堆上某个类的成员,则位于堆上)。

如果只是将其用作变量,它将存储在堆栈上:
Sample blah

strName
将放置在您的
示例
对象所在的位置。然而,类
string
可以在引擎盖下寻址它喜欢的任何存储,无论它是否使用普通变量(然后它们再次被放置在
字符串
放置的位置,指向某物的指针,内存映射,始终只是从地球的另一端查询XML接口

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



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

strName
将放置在您的
示例
对象所在的位置。但是,类
字符串
可以在引擎盖下寻址它喜欢的任何存储,无论它是否使用正态变量(然后它们被放置在
字符串的位置,指向某个东西的指针,内存映射,一直都只是从地球的另一端查询XML接口

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



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

现在,如果执行Sample blah=new Sample();则运算符new将在堆中分配内存(指针将位于堆栈上).*如果指针是在堆本身上创建的类的成员,则不是!Heapceptionright。添加了该选项。在尝试彻底检查时很难考虑每个示例:)现在,如果执行Sample blah=new Sample();则运算符new将在堆中分配内存(指针将位于堆栈上)*如果指针是堆本身上创建的类的成员,HeAPCEPTONTURE,则不必考虑。当试图彻底时,很难想到每个例子:C++标准没有定义“堆栈”和“堆”。因此,理论上讲,只要保存生命语义,它就取决于编译器。此外,<代码> STD::String 可以保留它的实际数据,无论它想做什么,C++标准都不定义“栈”和“堆”。所以理论上,只要保留生命周期语义,就由编译器决定。此外,
std::string
可以在任何地方保留其实际数据。