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()
,无法取消引用。
我的代码中出现 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()
,无法取消引用。