new-c++语句vector<string> v1;v1对象一定放在栈中吗?

问题描述

c++语句vector<string> v1;v1对象一定放在栈中吗?

如果有这么一句程序:vector v1;

v1是分配在栈上吗?不要小看这个问题,书里的基础概念我已经读了几遍,但是这个迷惑仍然不能解决,要不我就不用花时间上网来问了,期望能有高手指教,

按一般的理解,大概是这样:

C++对象存放在堆上还是栈上由你的代码控制,用new申请的对象放到堆上(new是没有重载的),否则放在栈上,比如

class A {};

A a; //A的对象在栈中分配内存
A * a = new A(); //A的对象在堆上分配内存

上面应该是没有疑问的,可是看下面代码:

#include
#include
using namespace std;

class A {
public:
A(void) :v1(10) {v1[0]="abc";}
vector v1;
};

A *getA()
{
A * a = new A; // 没重载 new 操作符的。
return a;
}

int main()
{
A *b = getA();
string s1("ABCDEFHIMDI");
printf(b->v1[0].data());
if(b->v1.size()==10) printf(":ok");

return 0;

}

按上面逻辑,上面代码中v1应该在栈上,而“a 指向的内存空间(new A)”应该在堆上,当我调用完getA函数之后,函数getA的栈空间会被自动回收,那么获取的对象指针(即b)所指的对象的成员v1就指向无意义的内存空间(已被回收的栈空间)了,按这个逻辑,似乎都是确切无疑的推理,那么程序应该会出问题,可是程序能正常运行输出“abc:ok”,为什么呢?

解决方案

v1不一定在堆栈上,在不在堆栈上要看它属于的那个A的实例对象在不在堆栈上。
你把问题想复杂了。new和malloc的在堆上,局部变量在堆栈上。如果一个对象在堆栈上,它的成员也在堆栈上,如果一个对象在堆上,它的成员都在堆上。

解决方案二:

学编程有时候需要一点灵性。这我觉得并不难理解。你问来问去不如自己仔细想想。

解决方案三:

1、vector v1 并没有给他指定vector中的数据类型 2、getA函数的功能是动态申请一块内存类型为A ,并返回该内存的地址,在getA函数结束之后申请的内存并不会消失,因为是在堆上申请的,销毁的只不过是栈中的变量,包括变量a,可是在变量a销毁之前已经把a中的值(也就是堆上那块内存的地址)返回了。因此b获取了该地址,b也就变的有意义了。后面的逻辑就通了。
首先楼主没有搞清楚哪种内存是在堆上的,而且楼主虽然知道函数结束之后会销毁栈上的变量,这一理解只是停留在表面上,并没有深刻的理解这句话的含义!最后楼主对于指针的运用不到位,有空去看看指针方面的书。

解决方案四:

“v1不一定在堆栈上,在不在堆栈上要看它属于的那个A的实例对象在不在堆栈上。”这是对的。

解决方案五:

楼主确实态度有问题。关于你要一个权威的说法,你可以看C++ primer的18.1.1,有和2楼几乎一样的话。

解决方案六:

你没有搞清楚普通变量和指针变量在访问过程上的不同,
也没有搞清楚变量内存的存放形式。

建议你把这段代码反编译,汇编级调试一下,你就明白了。

解决方案七:

我只是想确定c++语句vector v1;v1对象不一定放在栈中,正如caozhy所说,“v1不一定在堆栈上,在不在堆栈上要看它属于的那个A的实例对象在不在堆栈上。”如果这句话是对的,那么就没有问题了,只是换个角度问这个问题,因为我实在不能确定这句话是否正确?哪位高手能告诉一下,这哪里有一个权威出处吗??

解决方案八:

是这样的,虽然你调用了函数getA来获取A对象,但是你获取的那个A对象是在堆上分配的,getA函数返回时,系统会清理getA函数栈上的数据,但因为
A对象是在堆上分配的,并不会被清理掉,所以你的函数可以获得正确结果。对于C++对象的内存分配方式,数据作用域多了解下就清楚了。

解决方案九:

有啥问题可以直接找我

解决方案十:

我晕,v1是你指针a的成员,a在堆上,v1自然也在堆上。

时间: 2024-09-23 23:12:32

new-c++语句vector&amp;lt;string&amp;gt; v1;v1对象一定放在栈中吗?的相关文章

Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加

问题描述 Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加 Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加,没有的话重新加入一条新的记录,Sql语句怎么实现? 当我页面添加的是"利群"时,添加一盒,那么数据库中利群这条记录中的num字段中的4变成5,如果是页面添加的是"黄鹤楼"同理,如果添加的不是name字段中的这两个,就新插入一条数据.Sql语句怎么写??急急急. 是Mysql的数据

sql-C#中写SQL语句,单双引号的区别,为什么会报标准表达式中数据类型不匹配。

问题描述 C#中写SQL语句,单双引号的区别,为什么会报标准表达式中数据类型不匹配. OleDbDataAdapter WorkPieceDataDA = new OleDbDataAdapter("update" + "[" + ming + "]" + "set " + lieming[j, 0] + " = '" + jilushuzhi_left[j, i] + "' where 点数 =

java-请问下面语句怎么将查询出来的很多users实体对象发给客户端,使用json总是错误,

问题描述 请问下面语句怎么将查询出来的很多users实体对象发给客户端,使用json总是错误, String jpql = "SELECT u FROM User u WHERE u.name = :name"; Query query = em.createQuery(jpql); List users = query.getResultList(); 怎么得到每个list中的User 解决方案 用json是最好的,当然也可以使用user的序列化,只是java的序列化相对来说要慢一点

明天要交期末作业,在线等。昨天发帖没人理我.VECTOR对象如何保存到文件中啊

问题描述 我是Java初学者,请问是否可以将vector的对象直接保存到文件中和从文件中读取呢?写的是一个电话本程序,conects是一个vector对象.下面是代码的一部分,是我照着书上自己乱写的,一保存就会报异常.求大神指导.publicvoidSave(Filefile){//保存方法try{FileOutputStreamtext=newFileOutputStream(file);ObjectOutputStreamfw=newObjectOutputStream(text);fw.w

求助,vector对象如何保存到文件中?

问题描述 我是Java初学者,请问是否可以将vector的对象直接保存到文件中和从文件中读取呢?写的是一个电话本程序,conects是一个vector对象.下面是代码的一部分,是我照着书上自己乱写的,一保存就会报异常.求大神指导.publicvoidSave(Filefile){//保存方法try{FileOutputStreamtext=newFileOutputStream(file);ObjectOutputStreamfw=newObjectOutputStream(text);fw.w

调用动态链接库 构造其中类,成员变量vector,构造函数执行后刚构造的对象中成员变量全是乱码

问题描述 调用动态链接库 构造其中类,成员变量vector,构造函数执行后刚构造的对象中成员变量全是乱码 如题 VS2010 c++调用动态链接库 调试发现 构造动态链接库中类的时候,其中的成员变量vector 没问题,一旦构造函数执行后返回主程序,则刚构造的对象中成员变量全是乱码? 解决方案 类的成员对象变量何时构造 解决方案二: 不会,是不是你程序自身的问题? 解决方案三: 额,程序以前都调通了.这种情况以前出现过一次,我忘记了是怎么弄的了. 解决方案四: 代码那个地方有问题吧,仔细检查下

c++-C#中的string或者char类型数据如何转化为C++中的char类型数据

问题描述 C#中的string或者char类型数据如何转化为C++中的char类型数据 C++代码:bool hasfire(char s[100]) 因为使用C++做DLL文件,调用hasfire()这个函数时,发现C#中的char类型和C++中的不大一样,不知道怎么处理才能把C#中的char转化成C++中的char类型.

String类型存到mysql类型为text的字段中怎么出现了乱码?

问题描述 String类型存到mysql类型为text的字段中怎么出现了乱码? 一个String类型的存到mysql类型为text的字段中出现了乱码,需要怎么改呢? 解决方案 db-url后面加?useUnicode=true&characterEncoding=GBK 数据库的基字符集改成utf8 表中字段字符集改为utf8 解决方案二: 可能是你的编码有问题... 意思就是你的mysql的默认编码与输入的string时的编码不同吧.... 解决方案三: 参考此文http://blog.csd

新手求助。String创建了几个对象

问题描述 声明一个字符串不是相当于new了一个String对象吗?而两个对象用==进行比较时,比较的是引用指向的地址.那么Stringa="qwe";Stringb="qwe";String创建了几个对象?如果创建了两个对象的话那么a==b应该是fasle可是我实验的返回值却是true如果只创建了一个对象,那么为什么网上的都说不能用==比较两个字符串是否相等? 解决方案 解决方案二:有没有人啊????????解决方案三:虚拟机中有种叫常量池的地方解决方案四:Stri