2016-05-03 14 views
0

Ich habe einige Probleme, wenn ich 2 Vektoren verketten.Std :: Bad_alloc beim Verketten von zwei Vektoren

std::vector<Transform3D> out; 
for(double theta = 0; theta <= 2*M_PI ; theta+=1) 
{ 
    for(double phi = 0; phi <= M_PI ; phi+=1) 
    { 
     double sphere_x = obj_x + r*cos(theta)*sin(phi); 
     double sphere_y = obj_y + r*sin(theta)*sin(phi); 
     double sphere_z = obj_z + + r*cos(phi); 
     Transform3D<> transformation_matrix = transform(obj_x,obj_y,obj_z,sphere_x,sphere_y,sphere_z); 

     if(0.01<(transformation_matrix.P()[0] - current_x) || 
      0.01<transformation_matrix.P()[1] - current_y || 
      0.01<transformation_matrix.P()[2] - current_z) 
     { 
      cout << "Interpolate: " << endl; 
      std::vector<Transform3D> transformation_i = invKin_LargeDisplacement(transformation_matrix); 

      out.insert(out.end(),transformation_i.begin(),transformation_i.end()); 
     } 
     else 
     { 
      cout << "OK" << endl; 
      out.push_back(transformation_matrix); 
     } 
     cout << out.size() << endl; 
     cout << sizeof(Transform3D<>) << endl; 
    } 
} 

out.insert(..) scheint zu verursachen, wird die bad_alloc, aber die zusätzlichen Daten benötigt werden.

Während das Problem debuggen, ich habe die Größe des Vektors gedruckt, während die for-Schleife und bekam die folgende Ausgabe ausgeführt wird:

Interpolate: 
6346700 
Interpolate: 
12052200 
Interpolate: 
16476100 
Interpolate: 
20127501 
Interpolate: 
26474201 
Interpolate: 
32239601 
Interpolate: 
36748301 
Interpolate: 
40416502 
Interpolate: 
46763202 
Interpolate: 
52659402 
Interpolate: 
57349102 
Interpolate: 
61053903 
Interpolate: 
67400603 
Interpolate: 
73377503 
Interpolate: 
terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 
Aborted (core dumped) 

da ich die bad_alloc vermeiden kann irgendeine Weise bekommen, während sie noch an der Lage interpolieren?

+0

Sie haben keinen Speicher mehr. Zeit zu suchen, wo Sie die Speicherauslastung reduzieren können. – StoryTeller

+0

Ich habe den Tausch noch nicht benutzt .. – Lamda

+1

73 Millionen Objekte können viel Speicher sein. Was ist 'sizeof (rw :: math :: Transform3D <>)'? – NathanOliver

Antwort

0

Wenn wir Ihnen annehmen Transformation eine PoD mit einer 4x4-Matrix von Schwimmern (4 Byte):

Größe von Transformations = 4 * 4 * 4 = 64 Byte
Größe des Arrays an exception = 73377503

64 * 73377503 = 4696160192 Bytes = 4,696160192 Gigabytes

Mit einem Vektor dieser Größenordnung erwarte ich Sie aus dem Speicher lief ...

Wie viel Speicher haben Sie in Ihrem Rechner haben und tun Sie echte brauchen Sie 4,7 GB an Daten?

Wenn dies der Fall ist, sollten Sie entweder die Daten im Speicher komprimieren und/oder in einen Dateicache schreiben.

Verwandte Themen