我有一堂课
class Sample
{
string strName;
};
Sample *obj = new Sample()
如果我使用创建字符串的位置为示例创建一个对象strName
?它是在堆栈中还是在堆中?
我有一堂课
class Sample
{
string strName;
};
Sample *obj = new Sample()
如果我使用创建字符串的位置为示例创建一个对象strName
?它是在堆栈中还是在堆中?
无处,因为Sample obj = new Sample()
不会编译。
如果您的意思是Sample* obj = new Sample()
,那么它在动态存储(堆)中。
当您调用delete obj
时,字符串将被自动删除,即使它在堆上。
整个 ogobj
都在“堆”上,它的数据成员也是如此。但是,您不必担心管理分配给数据成员的内存。删除obj
也会处理字符串。
strName
将放置在您Sample
放置对象的位置。但是,类string
可能在后台寻址它喜欢的任何存储,是否使用普通变量(然后再次将它们放置在string
放置的位置,指向某物的指针,内存映射,始终只是从另一端查询 XML 接口地球。
但是,string
必须以某种方式存储地址,例如,将其指针或引用或 url 或使用的任何寻址方案放置在string
放置的位置。
相关经验法则:指针本身就是值(这就是为什么在对象复制情况下很难正确处理)。
结构体、数组、指针和基本数值类型将在分配类的任何位置与类一起创建。
字符串更复杂。它们是一种容器。定义容器的字符串成员将作为示例类中的成员存储在类的内存块中。字符串的文本可能会分配到堆上的其他地方(取决于字符串类的实现)。
现在,如果你这样做,Sample* blah = new Sample();
那么 operator new 将在堆中分配内存(指针将在堆栈上,或者如果它最初是堆上某个类的成员,则在堆上)。
如果只是将其用作变量,它将存储在堆栈中:Sample blah;