为什么我的代码出现“访问冲突读取位置”错误?

时间:2011-10-06 09:40:51

标签: c++

有人能告诉我为什么我会通过此代码示例获得“访问冲突读取位置”吗?我该如何解决这个问题?

#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;
}

4 个答案:

答案 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结构,它们将自动成为一流名称。