#include<iostream>
#include<process.h>
using namespace std;
template<class T>
class List{
class Node{
public:
T num;
Node*next;
}*head,*tail;
public:
List(){
head = tail = NULL;
}
void insert(T *n){
Node*tmp=new Node;
tmp->next = head;
tmp->num = *n;
head = tmp;
if (tail == NULL){
tail = tmp;
}
}
void append(T*n){
Node*tmp=new Node;
tmp->next=NULL;
tmp->num = *n;
if (tail == NULL){
head = tail = tmp;
}
else {
tail->next = tmp;
tail = tmp;
}
}
T Get(){
if (head == NULL){
exit(0);
}
else{
T t = head->num;
Node*p = head;
if (head->next == NULL){
head = tail = NULL;
}
else{
head = head->next;
}
delete (p);
return t;
}
}
};
class person{
public:
char*name=new char[];//problem lies here!
//char name[20];
int age;
float hight;
person(){}
};
int main(){
person a;
List<int>link1;
List<person>link2;
for (int i = 0; i < 5; i++){
cin >> a.name >> a.age >> a.hight;
link2.insert(&a);
link1.append(&i);
}
for (int i = 0; i < 5; i++){
a = link2.Get();
link2.append(&a);
cout << a.name << " " << link1.Get() << endl;
}
}
正如代码中的解释所示,当使用char*name=new char[]
替换char name[20]
时,程序出错了。它不会按预期输出所有名称,但只打印最后一个输入名称5次。那么这两个表达式之间的区别是什么?
非常感谢。
答案 0 :(得分:0)
new char[]
不能在GCC下编译。但是,new char[20]
确实如此。
char[20]
告诉编译器你需要一个数组中的20个字符。这通常在您的调用堆栈上分配。非常大的分配可能导致堆栈溢出,因此在某些圈子中不鼓励这样做。
如果您使用new
,则必须致电delete[] name
,否则您将遇到内存泄漏问题。如果您致电delete name
,您的代码就会出错,因为该数组不会被删除,只会删除char *
。