2011-10-06 65 views
5

任何人都可以告诉我为什么我得到“访问违规读取位置”与此代码示例?我该如何解决这个问题?为什么使用此代码获得“访问冲突读取位置”错误?

#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

哪一行导致错误? –

+0

对于一个问得好的问题+1([sscce](http://sscce.org)) – Flexo

回答

4

它的崩溃在这条线:

abc->test123.push_back(a1); 

的原因是因为你分配它上面两行使用malloc。因此,test123的内容未初始化。所以当你拨打push_back就崩溃了。

+0

感谢您的快速回复,那么我该如何解决这个问题? – tandaica0612

+0

使用'new StructTest'而不是'malloc(sizeof(StructTest))'。相同的情况适用于另一个'malloc'使用'new'。 – Mysticial

6

您没有创建test123。用new而不是malloc分配结构,这将为您创建test123

abc = new StructTest; 
Struct1* a1 = new Struct1; 

记得用delete,而不是free处置。

事实上,由于您使用的是C++,因此您应该停止使用malloc

1

不要使用malloc,请使用new。 malloc不会导致构造函数被调用,因此在这种情况下,您的向量不是有效的对象。

0

因为,当你用“malloc”分配一个块时,它可能包含垃圾,零或任何东西。

对象test123是C++对象,其构造函数尚未执行。改为使用运营商new。另外,虽然我们在这个主题上,在C++中,没有必要使用结构体,它们将自动成为一流的名字。