STL内存分配和结构体指针遇到的问题——auto _Pnext = &_Myproxy->_Myfirstiter
问题来源
在使用结构体含有vector实现树的结构时,需要对树中的vector赋值操作,教科书中使用的是struct数组,而我使用struct*数组时,发生了访问问题
示例代码
#include<bits/stdc++.h>
#define MAX 100
using namespace std;
struct person {
char name[100];
vector<int> scores;
};
int n;
vector<person*> class1(MAX);
vector<person> class2(MAX);
int main() {
scanf("%d", &n);
int courses=0;
for (int i = 0; i < n; i++) {
//Case 1: Using struct pointer
person *p = (person*)malloc(sizeof(person)) ;
scanf("%s %d", p->name, &courses);
class1[i] = p;
class2[i] = *p;
//Case 2: Using struct
//person p;
//scanf("%s %d", p.name, &courses);
//class1[i] = &p;
//class2[i] = p;
for (int j = 0; j < courses; j++) {
int score;
scanf("%d", &score);
class1[i]->scores.push_back(score);//Using Case 1 will bug here
class2[i].scores.push_back(score);//Using Case 1 will not bug here
}
}
}
问题截图
注意到结构体指针和结构体分配的位置不一样,结构体指针是分配在堆内存中的,结构体变量分配在栈空间,怀疑是这里影响了托管类的初始化
20211008更新:
实验室的好兄弟看到这篇文章,告诉我问题的答案了,主要是new和malloc的问题。当STL遇到malloc的时候就会有奇怪的bug。我个人再一次猜测是malloc的时候没有算好struct结构体的大小,即sizeof无法估计出STL部分的大小。
person* p = (person*)malloc(sizeof(person));
改为
person *p = new person;
问题解决了
改进方案
在使用STL系列时不使用指针访问,都用结构数组来访问。STL相关的部分用new初始化。