我想创建一个函数来创建一个结构数组。我所做的是:
struct Student {
char studentNames[128];
unsigned int FN;
short selectiveDisciplinesList[10];
unsigned short countOfSelectiveDisciplines;
bool hasTakenExams;
};
void fillInStudentInfo(Student &student) {...}
Student createStudentsArray() {
unsigned int countOfStudents;
std::cout << "Enter the number of students You are going to write down: " << std::endl;
std::cin >> countOfStudents;
Student studentsArray[countOfStudents];
for (int i = 0; i < countOfStudents; ++i) {
fillInStudentInfo(studentsArray[i]);
}
return *studentsArray;
}
然而,当在main()
中时,我分配:
Student studentArray = createStudentsArray();
我无法访问每个不同结构的成员(例如studentArray[i].something
(。
这个问题是从哪里来的?
如果我这样做:
Student * createStudentsArray() {
...
return studentsArray;
}
带有
Student * studentArray = createStudentsArray();
我的IDE警告我:
与返回的本地变量关联的堆栈内存的地址
但我似乎能够访问每个结构的成员。这是件坏事吗?
你真的不能用这种方式做你想做的事情:
Student createStudentsArray() {
...
Student studentsArray[countOfStudents];
...
return *studentsArray;
}
首先,这是使用一个可变长度数组,严格地说,这是无效的C++。例如,我的编译器不允许这样做
其次,它只返回一个Student
。即使它全部返回,效率也很低,因为它必须全部复制,但它没有。
你试过这个:
Student *createStudentsArray() {
...
Student studentsArray[countOfStudents];
...
return studentsArray;
}
情况更糟。一旦函数结束,分配给该数组的内存就会被释放。这就是编译器警告你的。事情似乎在之后发生了,但很快就会发生非常糟糕的事情。
大多数有经验的C++开发人员都会这样做:
std::vector<Student> createStudentsArray() {
...
std::vector<Student> students(countOfStudents);
...
return students;
}
如果你";不允许使用矢量";(StackOverflow一直看到这一点(,然后执行:
Student *createStudentsArray() {
...
Student *studentsArray = new Student[countOfStudents];
...
return studentsArray;
}
但一旦你用完了这个数组,你就必须delete[]
脚注-如果你真的感兴趣,可以提供更多信息。
事实上,经验丰富的开发人员会这样做:
std::vector<std::shared_ptr<Student>> createStudentsArray() {
...
std::vector<std::shared_ptr<Student> students(countOfStudents);
for (int......)
{
students.push_back(std::make_shared<Student>());
...
}
return students;
}
现在,vector
包含一堆智能指针,而不是实际的对象,这是制作较大对象的数组(或其他容器(的最有效方法。std::vector
和std::shared_ptr
将自动为您清理所有内存。