问题的背景:
之前在写c语言实验课作业的时候,老师布置的是用struct类型来创建一个Student变量,包括姓名、学号、性别和成绩,并初始化一个Student类的数组然后随机化学生的初始成绩,来完成对学生成绩的排序和信息的输出。
我想作为既然把学生作为一个struct类型来看待,并且还要实现学生成绩的排序与信息展示,那么完全可以把Struct类型升级成C++里的那种Class类型,让Student作为一个类拥有自己的数据成员和成员函数,即一个学生可以拥有姓名、学号、性别和成绩这四种数据;同时可以有显示所有信息和对成绩排序的方法。于是我想到了用函数指针来实现struct类型中的成员函数。
问题的发生:
在造构造函数和析构函数的轮子时,出现了严重的问题。为了近似地实现构造函数的功能(其实没什么必要2333,因为这点数据量等程序结束后交给操作系统一次性回收完全没啥问题,纯粹为了实现一下本人的好奇心),我选择把Student的数据成员全部设置成对应的指针变量,然后用构造函数给这些指针变量申请堆内存,最后在析构函数内释放这些堆内存。但是写下来之后运行的时候vs报了指针为空的异常。
最后排查下来以后,才发现是构造函数出了问题,在构造函数内申请的堆内存并没有成功地返回到主函数中,进而这些数据成员指针在初始化为空指针后就算执行了构造函数,指针也仍然为空。进一步排查后发现,是指针传递过程中犯了一些基础性的错误,导致本来应该使用地址传递的地方使用了值传递,因此构造函数内申请堆内存后主函数的指针并未因此指向之前开辟的堆内存。
对当时情形的代码简化及对比:
//此处代码里,若把堆内存申请方式从malloc/free换成c++中的new/delete,结果也是一样的
#include <cstdio>
#include <cstdlib>
void ApplyHeapMemory1(int* _p1) //传指针,无返回值
{
_p1 = (int*)malloc(3 * sizeof(int));
for (int i = 0; i < 3; i