C++小程序出错(结构体)
//动态分配内存,接收输入结构数据后输出并释放内存
#include <iostream>
#include <string>
using namespace std;
struct stu
{
string name;
string 易做图;
float score;
}zhangsan{"张三","男",99}; //错误处(出问题后我查了书,这么写似乎是可以的)
int main()
{
str *p;
p=new stu;
p=&zhangsan;
cout<<p->name<<p->易做图<<p->score<<endl;
delete p;
return 0;
}
问题:是什么错?应该怎么写?
补充:str *p;//这句打错了,应该为stu *p;问题依然存在,还是前面的问题
追问:你解释得非常清楚,受教。问个,这么说,new出来的内存不必释放掉也可以的?因为它是局部变量,会自动回收内存。new出来的内存一般不用手动delete吗。
答案:我谈谈我的看法:1.首先我说说为啥2楼要注释掉你的delete p,确实,前面你用new stu分配了一块内存,用完后应该用delete p释放内存,不然会有内存泄露问题,但是你有没有注意到一点,这句:p=&zhangsan ,此时,p指针的值已经不是你用new 分配的那块内存的地址了,而是&zhangsan, zhangsan这个结构体变量是一个全局变量,它的类型是auto(顺便说一下,变量类型分为auto和static,限于篇幅,你可以自己去看书关于其定义),当程序流程离开变量的存活范围后,这里zhangsan是个全局变量,也就是当程序结束后,注意了:它是auto类型的,在程序结束时,其占用的内存会自动释放掉,你不能用delete,所以你在delete p 时,你是在对zhangsan这块内存进行delete,这是不允许的,delete只能对堆里的内存进行释放,虽然可以编译通过,但那是非法的,运行时要崩溃!
2.实际上,你这个程序无法通过编译,主要是这里的问题:
struct stu
{
string name;
string 易做图;
float score;
}zhangsan{"张三","男",99};
2楼的同学已经说明了原因,但他说的不太对,debug窗口的错误是说:非聚合类型不能以列表方式进行初始化,像数组就是聚合类型,可以这么初始化,2的同学说反了!具体赋值办法如2楼所述,zhangsan.name.....一个一个来,而且必须放在函数体里赋值
少了个 等号!
zhangsan = {"张三","男",99};
这样就可以了。
但是你的程序中会有内存泄露问题!!
因为你new出来的stu没有被释放掉……
上一个:c++编程员工工资管理系统
下一个:C++如何做网络聊天工具?