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初始化。

posted @ 2021-08-13 16:51  Sanhao99  阅读(628)  评论(0编辑  收藏  举报