"Invalid pointer dequeued from free list",断点malloc_error_break无济于事

"Invalid pointer dequeued from free list", breakpoint in malloc_error_break not helping

本文关键字:malloc error 无济于事 break 断点 list pointer Invalid dequeued from free      更新时间:2023-10-16

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

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

在"while(!quit)"游戏循环开始之前,我在alldogpart中添加了几个Dogpart,但这些都不是问题:

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;
};

在Mac上使用Xcode,你也可以使用"Enable Address santizer "。在Xcode 7.3中,选择"编辑方案",然后选择"运行或测试"页面,"诊断"选项卡,并勾选"启用地址消毒"。

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

你已经把堆变成垃圾了。在linux上,在valgrind下运行这个程序,它会指出你的错误。你也可以试试电栅栏

如果不是linux请注明您的平台