什么时候要new?

来源:百度知道 编辑:UC知道 时间:2024/06/23 19:58:09
#include <iostream>
using namespace std;
#define MAX_NUM 512

struct Node
{
char name[MAX_NUM];
int Math;
int Chinese;
int English;
};

void main()
{
Node a[3]; //1
for(int i=0;i<3;i++)
{
cout<<"请输入姓名:"<<endl;
cin>>a[i].name;
cout<<"请输入数学成绩:"<<endl;
cin>>a[i].Math;
cout<<"请输入语文成绩:"<<endl;
cin>>a[i].Chinese;
cout<<"请输入英语成绩:"<<endl;
cin>>a[i].English;
cout<<endl;
}
}
为什么在1处不用new,直接用类名实例化一个对象有没有开辟空间?为什么有的类名实例化一个对象后要new一下。

这里申明一个结构体数组,已经分配空间了
如果是Node *a;
那么就要new,因为a还没有给它分配空间

1处可以NEW 但是没有必要。而且最后还要delete否则会有内存泄漏。
这个程序里直接实例化分配了空间,但是分配再栈中,是自动变量。程序结束后自动释放。而且使用这个数组和这个数组的定义都在同一个函数中,用完系统帮你回收多好。
用NEW也会分配空间,分配在堆中,必须你手动释放。下面给出用NEW 的修改版本
#include <iostream>
using namespace std;
#define MAX_NUM 512

struct Node
{
char name[MAX_NUM];
int Math;
int Chinese;
int English;
};

void main()
{
Node *p = new Node[3];
for(int i=0;i<3;i++)
{
cout<<"请输入姓名:"<<endl;
cin>>p[i].name;
cout<<"请输入数学成绩:"<<endl;
cin>>p[i].Math;
cout<<"请输入语文成绩:"<<endl;
cin>>p[i].Chinese;
cout<<"请输入英语成绩:"<<endl;
cin>>p[i].English;
cout<<endl;
}
delete[]p;
}