Это похоже на самую прямую вещь, но все же она сохраняет 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));
}
}
Что вызывает B :: initiate(), когда происходит segfault? – Adam
вызов в doStuff() для инициирования является виновником. Кроме того, я отлаживал cout << myVector.size() строку прямо над этим вызовом, и он возвращает 1, существуют векторы и т. Д., Все кажется прекрасным ??? – user4143590
«Должен ли вектор Bs полностью перераспределять каждый раз, когда я делаю один из компонентов более крупным внутренним вектором?» № – Adam