有人能告诉我为什么我会通过此代码示例获得“访问冲突读取位置”吗?我该如何解决这个问题?
#include <vector>
using namespace std;
struct StructTest;
struct Struct1;
typedef struct Struct1{
StructTest* test;
} Struct1;
typedef struct StructTest{
vector<Struct1*> test123;
} StructTest;
static StructTest* abc;
int test(){
abc = (StructTest*) malloc(sizeof(StructTest));;
Struct1* a1 = (Struct1*) malloc(sizeof(Struct1));
a1->test = abc;
abc->test123.push_back(a1);
return 0;
}
int main(){
test();
return 0;
}
答案 0 :(得分:6)
您没有创建test123
。使用new
而不是malloc
分配结构,这将为您创建test123
。
abc = new StructTest;
Struct1* a1 = new Struct1;
请记住使用delete
而不是free
处理。
事实上,由于您使用的是C ++,因此您应该停止使用malloc
。
答案 1 :(得分:4)
这一行崩溃了:
abc->test123.push_back(a1);
原因是你使用malloc
在上面分配了两行。因此,test123
的内容未初始化。所以当你打电话给push_back
时它会崩溃。
答案 2 :(得分:1)
不要使用malloc,请使用new。 malloc不会导致构造函数被调用,因此在这种情况下,您的向量不是有效对象。
答案 3 :(得分:0)
因为,当您使用“malloc”分配块时,它可能包含垃圾,零或其他任何内容。
对象test123
是一个C ++对象,其构造函数尚未执行。请尝试使用运算符new
。
另外,在我们讨论这个主题时,在C ++中,不需要typedef
结构,它们将自动成为一流名称。