I'm aware that there are several similar questions to this one already, but I've read through them and none of them seem to cover my specific problem...
I'm trying to dereference a public pointer from a struct, but it's throwing a SIGSEV Segmentation fault, even though the pointer does point to a value
It prints 1 & 2 but does not get any further. If I change it to reference the pointer rather than the value, the error moves to wherever I reference the value, so I know the issue is with dereferencing, not the rest of the line.
If you need to see any more of my code in order to find the issue, just ask. I just didn't want to make you trawl through hundreds of lines unnecesarily...
#include <vector>
#include "Entities.cpp"
struct Chunk {
    public:
        std::vector<BaseEntity>* environment; // this is what I'm trying to access
        Chunk() {
            environment = new std::vector<BaseEntity>(1); // this is where init
            environment->push_back(Grass()); // adding something to it works fine
        }
        ~Chunk() {
            delete(environment);
        }
};
class World {
    public:
        Chunk* loaded[3][3];
        World() {
            for (int x = 0; x < 3; x++)
                for (int y = 0; y < 3; y++) {
                    loaded[x][y] = new Chunk();
                }
        }
        ~World() {
            for (int x = 0; x < 3; x++)
                for (int y = 0; y < 3; y++) {
                    delete(loaded[x][y]);
                }
        }
};
And here's the code that accesses it (in another class & file)
void render(SDL_Renderer* gRenderer, Atlas* atlas, World* world, int SCREEN_WIDTH, int SCREEN_HEIGHT) {
        printf("1");
        for (int x = 0; x < 3; x++)
            for (int y = 0; y < 3; y++) {
                printf("2");
                std::vector<BaseEntity> env =
                        *(world->loaded[x][y]->environment); // here is where the error occurs
                printf("3");
                printf('0' + env.size() + "");
                printf("a");
                for (const auto& a : env) {
                    printf("b");
                    drawTexture(gRenderer, atlas, a.atlasID,
                            SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
                }
                printf("4");
            }
        printf("5");
    }
This is the code that calls it:
int main(int argv, char** args) {
    SDL_Init( SDL_INIT_VIDEO );
    //The window we'll be rendering to
    SDL_Window* gWindow = SDL_CreateWindow(
         title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    if (gWindow == NULL) {
        printf("window error");
    }
    
    //Create renderer for window
    SDL_Renderer* gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED );
    if (gRenderer == NULL) {
        printf("renderer error");
    }
    bool quit = false; // quit flag
    //Event handler
    SDL_Event e;
    //nice little rendering class
    Renderer* renderer = new Renderer();
    //World
    World* world = new World();
    //Texture Atlas
    Atlas* atlas = new Atlas(SDL_GetWindowSurface( gWindow), gRenderer);
    //While application is running
        while( !quit )
        {
            //Handle events on queue
            while( SDL_PollEvent( &e ) != 0 )
            {
                switch(e.type) {
                    case SDL_QUIT: //User requests quit
                        quit = true;
                        break;
                }
                
            }
            //Clear screen
            //SDL_SetRenderDrawColor( gRenderer, 0, 0xFF, 0, 0xFF );
            SDL_RenderClear( gRenderer );
            renderer->render(gRenderer, atlas, world, SCREEN_WIDTH, SCREEN_HEIGHT);
            //Update the surface
            SDL_RenderPresent(gRenderer);
            //SDL_UpdateWindowSurface( gWindow );
        }
        delete (world, renderer, atlas);
        return 0;
}
 
     
    