2014-10-15 2 views
-1

Это похоже на самую прямую вещь, но все же она сохраняет segfault, независимо от того, что я пытаюсь. Извините, если это очевидно и легко найти, я искал около 2 часов в бесчисленных потоках векторных segfault, у кого-то нет такой точной проблемы.Segfault при попытке доступа к полям в объекте в векторе

class A 
{ 
protected: 
    std::vector<B> myVector = std::vector<B>(1); 
    void doStuff(); 
}; 

void A::doStuff() 
{ 
    myVector.push_back(B()); 
    myVector[0].initiate(); 
} 

class B 
{ 
public: 
    int a; 
    B(); 
    void initiate(); 
}; 

B::B() 
{ 
} 

void B ::initiate() 
{ 
    a = 0; //**this is where segfault happens** 
} 

Кроме того, что делать, если бы я тоже положил вектор в B? Должен ли вектор Bs полностью перераспределять каждый раз, когда я делаю один из компонентов более крупным внутренним вектором? Или это тоже будет segfault? В любом случае, есть ли способ выделить фиксированный объем памяти на векторный слот или что-то для объектов, которые я ожидаю расти ???

Редактировать: "А" .h

#ifndef PLATE_H 
#define PLATE_H 

#include "Column.h" 
#include <vector> 

class World; 
class Plate 
{ 
protected: 
    World* myWorld; 
    std::vector<Column> vColumns = std::vector<Column>(1); 

"А" .cpp:

void Plate::initiate(unsigned short xDim, unsigned short yDim, World * world) 
{ 
    myWorld = world; 
    dMass = 0; 

    for (int x = 0; x < xDim; x++) { 
     for (int y = 0; y < yDim; y++) { 
      vColumns.push_back(Column()); 
      std::cout << vColumns.size(); 
      vColumns[x + y*xDim].initiate(5,myWorld->cMantleDensity,myWorld); //%%%%%%% 5 is temporary 
      dMass = dMass + vColumns[x + y*xDim].getDensity() * vColumns[x + y*xDim].getNumGoxels(); 
     } 
    } 
} 

"Б" .h:

#ifndef COLUMN_H 
#define COLUMN_H 
#include <vector> 
#include "Goxel.h" 

class World; 
class Column 
{ 
protected: 
    World* myWorld; 
    std::vector<Goxel> vGoxels; 
    unsigned char cCrumple; 
    unsigned char cVolcanism; 
    unsigned short sThickness; 
    short sRootDepth; 
    float fDensity; 
public: 
    Column(); 
    void initiate(unsigned short, unsigned char,World* const); 

"Б" .cpp :

void Column::initiate(unsigned short thick, unsigned char mantleDensity,World* world) 
{ 
    myWorld = world; 
    cCrumple = 0; 
    cVolcanism = 0; 
    sThickness = thick; 
    fDensity = 58; //basalt 
    sRootDepth = (short)(-((sThickness * fDensity)/mantleDensity)); 

    for (int i = 0; i < thick; i++) 
    { 
     vGoxels.push_back(Goxel()); 
     vGoxels[i].quickInitiate((char)(((i-1)*58)/20)); 
    } 
} 
+0

Что вызывает B :: initiate(), когда происходит segfault? – Adam

+0

вызов в doStuff() для инициирования является виновником. Кроме того, я отлаживал cout << myVector.size() строку прямо над этим вызовом, и он возвращает 1, существуют векторы и т. Д., Все кажется прекрасным ??? – user4143590

+0

«Должен ли вектор Bs полностью перераспределять каждый раз, когда я делаю один из компонентов более крупным внутренним вектором?» № – Adam

ответ

0

ли это:

$ gdb a.out 
> run 
*segfault* 
> where 

отладчик покажет вам хороший трассировку стека, где на самом деле выдаёт ошибку сегментации, так что вам не придется гадать.

+0

У меня есть стек. Это в myWorld = world (или cCrumple = 0, если я прокомментирую myWorld = мир), независимо от первой попытки достичь фактического объекта Column. – user4143590

Смежные вопросы