map/set 使用 map.erase 后无可推崇

map/set no deferenceable after using map.erase

我的代码中出现 map/set 不可取消引用的调试断言错误,我不知道如何修复它,我已将问题精确定位到我的 [=23= 中的 map.erase ] 功能但是我不知道如何阻止问题发生任何帮助表示感谢谢谢

如果我删除擦除功能,它会起作用,但我需要它从地图上擦除项目,以便这些功能不再使用它们

ShapeDraw.h

#ifndef _SHAPE_
#define _SHAPE_
#include <Windows.h>
#include <cmath>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <algorithm>
#include <cstdlib>
#include <time.h>
#include <fstream>
#include <commdlg.h>
struct CardData
{
    int _x;
    int _y;
    LPCWSTR _filename;
    int _value;
    int _suit = 0; //0 - Hearts, 1 - Diamonds, 2 - Spaces, 3 - Clubs
    bool _face = 0; //0 - Face Down, 1 - Face Up <-- This bit is only used for adding the cards to the stacks and shit
};
struct cardStackList;
class Shape
{

public:
    cardStackList *stack[11];
    //extern cardStackList *stack[11];
    //static HBITMAP mBkg;
    int g_width = 10; //Default Pen Size is 10,
    int g_pen = PS_SOLID;
    int pCountMax = pCount;
    int pCount = 0; //Painting Count
    std::map<int, CardData> _cardMatrix;
    std::map<int, CardData>::iterator _rCardIter;
    cardStackList* make_stack();
    void insert(cardStackList *_stack);
    void CreateStacks();
    cardStackList* remove(cardStackList *_stack); //Remove the top most card
    cardStackList* search(cardStackList *_stack, int _value, int _suit);
    void display(cardStackList *_stack); //Draw Cards in descending order
    Shape()
    {
        for (int i = 0; i < 11; i++)
        {
            stack[i] = NULL;
        }
    }
};
#endif

ShapeDraw.cpp

#include "ShapeDraw.h"
struct cardStackList
{
    int _x;
    int _y;
    LPCWSTR _filename;
    int _value;
    int _suit;
    struct cardStackList *next;
    struct cardStackList *prev;
    bool _face; //0 - Face Down, 1 - Face Up
}*stack[11];
cardStackList* Shape::make_stack()
{
    int i;
    struct cardStackList *temp;
    temp = new(struct cardStackList);
    if (temp == NULL)
    {
        return 0;
    }
    else
    {
        i = rand() % (_cardMatrix.size());
        _rCardIter = _cardMatrix.find(i);
        temp->_x = _rCardIter->second._x;
        temp->_y = _rCardIter->second._y;
        temp->_filename = _rCardIter->second._filename;
        temp->_value = _rCardIter->second._value;
        temp->_suit = _rCardIter->second._suit;
        temp->_face = _rCardIter->second._face;
        temp->next = NULL;
        temp->prev = NULL;
        _cardMatrix.erase(_rCardIter);
        pCount--;
        pCountMax = _cardMatrix.size() + 1;
    }
    return temp;
}
void Shape::insert(cardStackList *_stack)
{
    struct cardStackList *temp, *s, *t;
    temp = make_stack();
    s = _stack;
    t = s;
    if (_stack == NULL)
    {
        _stack = temp;
        _stack->next = NULL;
        _stack->prev = NULL;
    }
    else
    {
        while (s != NULL)
        {
            t = s;
            s = s->next;
        }
        s = temp;
        s->prev = t;
        s->prev->next = s;
    }
}
cardStackList *Shape::remove(cardStackList *_stack)
{
    struct cardStackList *temp, *t, *return_card;
    temp = _stack;
    t = temp;
    while (temp != NULL)
    {
        t = temp;
        if (temp->next != NULL)
        {
            temp = temp->next;
        }
        else
        {
            temp = t;
        }
    }
    temp = t;
    return_card = temp->next;
    temp->next = temp->next->next;
    temp->next->prev = t;
    return return_card;
}
cardStackList *Shape::search(cardStackList *_stack, int _value, int _suit)
{
    struct cardStackList *temp;
    temp = _stack;
    while (temp->_value != _value && temp->_suit != _suit)
    {
        if (temp->next != NULL)
        {
            temp = temp->next;
        }
    }
    if (temp != NULL)
    {
        return temp;
    }
    return NULL; //Only reaches this if the _value and _suit does not exist in that specific stack
}
void Shape::display(cardStackList *_stack)
{

    struct cardStackList *_slot[11];
    /*
    slots 7 to 10 are the Ace Slots
    */
    for (int i = 0; i <= 10; i++)
    {
        _slot[i] = stack[i];
    }
    for (int i = 0; i <= 10; i++)
    {
        while (_slot[i] != NULL)
        {

        }
    }
}
void Shape::CreateStacks()
{
    for (int i = 0; i < 7; i++)
    {
        insert(stack[0]);
    }
    for (int i = 0; i < 6; i++)
    {
        insert(stack[1]);
    }
    for (int i = 0; i < 5; i++)
    {
        insert(stack[2]);
    }
    for (int i = 0; i < 4; i++)
    {
        insert(stack[3]);
    }
    for (int i = 0; i < 3; i++)
    {
        insert(stack[4]);
    }
    for (int i = 0; i < 2; i++)
    {
        insert(stack[5]);
    }
    for (int i = 0; i < 1; i++)
    {
        insert(stack[6]);
    }
    //Stuff that creates the 7 stacks here
}

问题出在这一行:

_rCardIter = _cardMatrix.find(i);

_cardMatrix 是地图,但 i 是地图中元素的索引(计数)。 find 最终将无法找到第 i 个索引和 return end 迭代器的卡片。

例如,我假设您的矩阵以卡号 0..51 开头。移除的第一张牌是第 23 张牌,因此矩阵有 51 张牌 0..22 和 24..51。下一次,你又想要第 23 张牌。 find 不会找到那个,因为那张卡片已被移除,您将获得的迭代器将是 _cardMatrix.end(),无法取消引用。