2011-10-06 9 views
5

¿Alguien puede decirme por qué obtengo "Ubicación de lectura de violación de acceso" con este ejemplo de código? ¿Y cómo puedo solucionar esto?¿Por qué obtengo un error de "Acceso a ubicación de lectura de violación" con este código?

#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

¿Qué línea causa el error? –

+0

+1 para una pregunta bien hecha ([sscce] (http://sscce.org)) – Flexo

Respuesta

4

Está fallando en esta línea:

abc->test123.push_back(a1); 

La razón se debe a que le sitúa por encima de dos líneas usando malloc. Por lo tanto, los contenidos de test123 no están inicializados. Por lo tanto, se bloquea cuando llamas al push_back.

+0

Gracias por su rápida respuesta, ¿cómo puedo solucionar esto? – tandaica0612

+0

Use 'new StructTest' en lugar de' malloc (sizeof (StructTest)) '. Lo mismo aplica para el otro 'malloc' use' new' en su lugar. – Mysticial

6

No creó test123. Asigne las estructuras con new en lugar de malloc y esto creará test123 para usted.

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

olvide depositar con delete en lugar de free.

De hecho, ya que está usando C++ simplemente debe dejar de usar malloc.

1

No utilice malloc, utilice nuevo. malloc no hace que se invoquen constructores, por lo que en este caso su vector no es un objeto válido.

0

Porque, cuando asigna un bloque con "malloc" puede contener basura, ceros o lo que sea.

El objeto test123 es un objeto C++ cuyo constructor no se ha ejecutado. Intente usar el operador new en su lugar.

Además, mientras estamos en el tema, en C++, no hay necesidad de estructuras typedef, se convertirán en nombres de primera clase automáticamente.

Cuestiones relacionadas