1

我有一堂课

class Sample
{
   string strName;
};

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

4

4 回答 4

5

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

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

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

于 2012-07-05T11:05:13.477 回答
2

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

于 2012-07-05T11:06:27.523 回答
1

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

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


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

于 2012-07-05T11:11:15.237 回答
1

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

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

现在,如果你这样做,Sample* blah = new Sample();那么 operator new 将在堆中分配内存(指针将在堆栈上,或者如果它最初是堆上某个类的成员,则在堆上)。
如果只是将其用作变量,它将存储在堆栈中:Sample blah;

于 2012-07-05T11:10:26.703 回答