"无效指针从空闲列表中退出",malloc_error_break中的断点没有帮助

时间:2015-07-23 01:42:41

标签: c++ memory sdl

我知道导致问题的代码行,但我不知道为什么。这是错误:

malloc: *** error for object 0x6080001416b0: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug

及相关代码: (我正在制作一种奇怪的宠物模拟器,你可以在那里建造狗,解释这些奇怪的狗的东西)

while (!quit)
{
    while(SDL_PollEvent(&e) != 0)
    {
        switch(e.type)
        {
            case (SDL_QUIT):
                quit = true;
            case (SDL_KEYDOWN):
            {
                Dogpart newDogpart(100,20);
                allDogparts.push_back(newDogpart); //the problem line
            }
        }
    }

    //game code
}

如果我注释掉这一行:

allDogparts.push_back(newDogpart);

当我触发SDL_KEYDOWN时它不会崩溃。

allDogparts是一个名为Dogpart

的结构的向量
std::vector<Dogpart> allDogparts; //declared globaly

我在#34; while(!quit)&#34;之前添加了几个Dogpart's给这样的所有Dogs #s;游戏循环开始,但这些都没有问题:

allDogparts.push_back(Dogpart(50,10));

我认为这可能是一个范围问题,但是当我单步执行代码时,我添加的新部分似乎仍然存在。单步执行,一旦SDL_KEYDOWN注册并添加了新部分,我就会完全通过游戏循环,并且因为我不明白的原因而在此行崩溃:

while(SDL_PollEvent(&e) != 0)

任何帮助解决这个问题,甚至只是解释发生了什么都将非常感谢,谢谢。

Dogpart:

struct Dogpart{
public:
Dogpart(float x, float y);
float x, y, w, h;
Uint8 r,g,b;
void update();
void render(SDL_Renderer* renderer);

bool mouseOver;
v2 mouseClickOffset; 

enum S_STATE
{
    DEFAULT,
    PRESSED, //clicked or touched down and held
    RELEASED //one frame, after pressed is false
} s_state;
};

2 个答案:

答案 0 :(得分:1)

在带Xcode的Mac上,您也可以使用“启用地址清理器”。 在Xcode 7.3中,选择“编辑方案”,然后选择“运行”或“测试”页面,“诊断”选项卡,并选中“启用地址清理程序”。

它提供类似于valgrind的内存损坏诊断。

答案 1 :(得分:0)

你已经破坏了你的堆。在linux上运行valgrind下的程序,它会指出你的错误。你也可以试试电围栏

如果不是linux,请指明您的平台