C++ &引用;无效指针已从可用列表“中退出队列”;,malloc中的断点\u错误\u中断不起作用

C++ &引用;无效指针已从可用列表“中退出队列”;,malloc中的断点\u错误\u中断不起作用,c++,memory,sdl,C++,Memory,Sdl,我知道导致问题的代码行,但我不知道为什么。这就是错误: malloc: *** error for object 0x6080001416b0: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug 及有关守则: (我正在制作一种奇怪的宠物sim卡,你可以在其中制作狗,来解释奇怪的狗的东西) 如果我注释掉这一行: allDogparts.push_back(newD

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

malloc: *** error for object 0x6080001416b0: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug
及有关守则: (我正在制作一种奇怪的宠物sim卡,你可以在其中制作狗,来解释奇怪的狗的东西)

如果我注释掉这一行:

allDogparts.push_back(newDogpart);
当我触发SDL_键时它不会崩溃

allDogparts是一个称为Dogpart的结构的向量

std::vector<Dogpart> allDogparts; //declared globaly
我认为这可能是一个范围问题,但当我逐步完成代码时,我添加的新部分似乎仍然存在。一步一步,一旦SDL_键控寄存器和新部件被添加,我就一直通过游戏循环,它在这条线上崩溃,原因我不明白:

while(SDL_PollEvent(&e) != 0)
如果您能帮我解决这个问题,或者只是解释一下发生了什么,我们将不胜感激,谢谢

狗零件:

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

你把你的垃圾堆毁了。在linux上,在valgrind下运行该程序,它将指出您的错误。你也可以试试电动围栏


如果不是linux,请在带有Xcode的Mac上指明您的平台,您也可以使用“启用地址消毒器”。 在Xcode 7.3中,选择“编辑方案”,然后选择运行或测试页面“诊断”选项卡并选中“启用地址消毒器”


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

是否确实要将堆栈分配的变量添加到向量?当函数作用域消失时,这些就消失了。这是我害怕的,但是当我走过去,它没有消失时,我认为这不是问题所在。由于对c语言有点陌生,我的内存有很多问题。当主循环运行时,我如何向向量添加变量?在“dogpart”中是什么?很可能您在其中有指针,而忘记添加复制构造函数。也看看,@Dweeberly:它不是那样工作的。堆栈变量将消失,但向量将保留其副本,直到向量本身被销毁。在原始问题中添加了“Dogpart”定义。@PetersMystion说它也适用于mac。或者您可以尝试使用
-fstack-protector-all
编译器标志(gcc或clang)-虽然它很弱,但有可能足以发现问题。
while(SDL_PollEvent(&e) != 0)
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;
};