visual studio 中函数调用和第一行函数之间的代码损坏问题
Code corruption issue between function call and first line of function in visual studio
我正在使用 visual studio 编译和 运行 纸牌游戏。我的问题似乎是当我调用函数 get_top_card()
void Deck::shuffle(){
//This function shuffles the deck.
Deck tempdeck;
while (cards.size() > 0)
{
int cardnumber = -1;
cardnumber = rand() % cards.size();
tempdeck.add_card_to_deck(cards[cardnumber],false);
erase_card(cardnumber);
}
while (tempdeck.size() >0){
add_card_to_deck(tempdeck.get_top_card(),false); //error occurs in this function
}
}
void Deck::add_card_to_deck(Card& card1, bool shift){ //Lets call this line A
if (face_up) card1.set_face_up(); //Lets call this line B
else card1.set_face_down();
Point new_location(decklocation.x , decklocation.y + cards.size() * 25);
if (shift) card1.move_card(card1.location(), new_location);
else card1.move_card(card1.location(), decklocation);
card1.button()->hide();
cards.push_back(card1);
}
当我运行使用调试器编译此代码时,我可以在实时变量中看到 A card1 行具有有效的卡值...
variable view
当我到达 B 行时,card1 现在已损坏..
corrupted variable view
有什么想法吗?
Card& Deck::get_top_card() //returns the top card and removes it from the deck
{
Card top_card = cards[cards.size()-1]; //holds the card
erase_card(cards.size()-1); //deletes it from the deck
return top_card;
}
我想我发现了下面的问题...正在测试
Card& Deck::get_top_card() //returns the top card and removes it from the deck
{
Card& top_card = cards[cards.size()-1]; //holds the card
erase_card(cards.size()-1); //deletes it from the deck
return top_card;
}
这就是问题所在...我返回的是卡片而不是教鞭。
谢谢大家的帮助!
更新:
由于此处未解决的问题,我现在进一步更改了代码
- 我已将我的私有卡片向量更改为卡片指针向量,并使用 new 将它们推送到向量中。
cards.push_back (new Card(suit,name,value,symbol,file));
- 这意味着我的函数现在是指针类型:
Card* Deck::get_top_card() //returns the top card and removes it from the deck
{
Card* top_card = cards[cards.size()-1]; //holds the card
cards.erase(cards.end()-1); //deletes it from the deck
return top_card;
}
void Deck::add_card_to_deck(Card* card, bool shift){ //adds a card to the bottom of the deck.
if (face_up) card->set_face_up();
else card->set_face_down();
Point new_location(decklocation.x , decklocation.y + cards.size() * 25);
if (shift) card->move_card(card->location(), new_location);
else card->move_card(card->location(), decklocation);
card->button()->hide();
cards.push_back(card);
}
这似乎解决了我遇到的问题。它还允许每张卡只复制一份,因为地址是存储和传递的内容。
有人看到我可能需要注意的其他事项吗?
谢谢!
问题出在我的获取顶卡功能上。
Card& Deck::get_top_card()
{
Card& top_card = cards[cards.size()-1]; //needed to create a reference.
erase_card(cards.size()-1);
return top_card;
}
更新:
这似乎是一个更好的答案:
void Deck::add_card_to_deck(Card* card, bool shift){ //adds a card to the bottom of the deck.
if (face_up) card->set_face_up();
else card->set_face_down();
Point new_location(decklocation.x , decklocation.y + cards.size() * 25);
if (shift) card->move_card(card->location(), new_location);
else card->move_card(card->location(), decklocation);
card->button()->hide();
cards.push_back(card);
}
Card* Deck::get_top_card() //returns the top card and removes it from the deck
{
Card* top_card = cards[cards.size()-1]; //holds the card
cards.erase(cards.end()-1); //deletes it from the deck
return top_card;
}
第一个版本:
Card& Deck::get_top_card() //returns the top card and removes it from the deck
{
Card top_card = cards[cards.size()-1]; //holds the card
erase_card(cards.size()-1); //deletes it from the deck
return top_card;
}
无效,因为您正在 return 引用范围结束的对象 top_card
。这个存储在堆栈中,可以很容易地覆盖。此外 CPU 可能会检查内存是否在栈顶上方访问导致崩溃。
这个版本也是非法的:
Card& Deck::get_top_card()
{
Card& top_card = cards[cards.size()-1]; //needed to create a reference.
erase_card(cards.size()-1);
return top_card;
}
自从这次您 return 引用位于堆上的向量的尖端并减小向量的大小。这是未定义的行为。
之所以有效,是因为在这种情况下,向量缓冲区不会重新分配,只是向量的大小会减一。结果引用指向有效的内存块(这可以防止崩溃),但它仍然是缓冲区溢出错误。
修复它的最可能的正确方法是来自 return 类型的兴奋剂参考:
Card Deck::get_top_card()deck
{
Card top_card = cards[cards.size()-1];
erase_card(cards.size()-1);
return top_card;
}
我怀疑你的 Card
是一个复杂的类型,很可能可以廉价地复制。
我正在使用 visual studio 编译和 运行 纸牌游戏。我的问题似乎是当我调用函数 get_top_card()
void Deck::shuffle(){
//This function shuffles the deck.
Deck tempdeck;
while (cards.size() > 0)
{
int cardnumber = -1;
cardnumber = rand() % cards.size();
tempdeck.add_card_to_deck(cards[cardnumber],false);
erase_card(cardnumber);
}
while (tempdeck.size() >0){
add_card_to_deck(tempdeck.get_top_card(),false); //error occurs in this function
}
}
void Deck::add_card_to_deck(Card& card1, bool shift){ //Lets call this line A
if (face_up) card1.set_face_up(); //Lets call this line B
else card1.set_face_down();
Point new_location(decklocation.x , decklocation.y + cards.size() * 25);
if (shift) card1.move_card(card1.location(), new_location);
else card1.move_card(card1.location(), decklocation);
card1.button()->hide();
cards.push_back(card1);
}
当我运行使用调试器编译此代码时,我可以在实时变量中看到 A card1 行具有有效的卡值... variable view
当我到达 B 行时,card1 现在已损坏.. corrupted variable view
有什么想法吗?
Card& Deck::get_top_card() //returns the top card and removes it from the deck
{
Card top_card = cards[cards.size()-1]; //holds the card
erase_card(cards.size()-1); //deletes it from the deck
return top_card;
}
我想我发现了下面的问题...正在测试
Card& Deck::get_top_card() //returns the top card and removes it from the deck
{
Card& top_card = cards[cards.size()-1]; //holds the card
erase_card(cards.size()-1); //deletes it from the deck
return top_card;
}
这就是问题所在...我返回的是卡片而不是教鞭。 谢谢大家的帮助!
更新: 由于此处未解决的问题,我现在进一步更改了代码
- 我已将我的私有卡片向量更改为卡片指针向量,并使用 new 将它们推送到向量中。
cards.push_back (new Card(suit,name,value,symbol,file));
- 这意味着我的函数现在是指针类型:
Card* Deck::get_top_card() //returns the top card and removes it from the deck
{
Card* top_card = cards[cards.size()-1]; //holds the card
cards.erase(cards.end()-1); //deletes it from the deck
return top_card;
}
void Deck::add_card_to_deck(Card* card, bool shift){ //adds a card to the bottom of the deck.
if (face_up) card->set_face_up();
else card->set_face_down();
Point new_location(decklocation.x , decklocation.y + cards.size() * 25);
if (shift) card->move_card(card->location(), new_location);
else card->move_card(card->location(), decklocation);
card->button()->hide();
cards.push_back(card);
}
这似乎解决了我遇到的问题。它还允许每张卡只复制一份,因为地址是存储和传递的内容。
有人看到我可能需要注意的其他事项吗?
谢谢!
问题出在我的获取顶卡功能上。
Card& Deck::get_top_card()
{
Card& top_card = cards[cards.size()-1]; //needed to create a reference.
erase_card(cards.size()-1);
return top_card;
}
更新: 这似乎是一个更好的答案:
void Deck::add_card_to_deck(Card* card, bool shift){ //adds a card to the bottom of the deck.
if (face_up) card->set_face_up();
else card->set_face_down();
Point new_location(decklocation.x , decklocation.y + cards.size() * 25);
if (shift) card->move_card(card->location(), new_location);
else card->move_card(card->location(), decklocation);
card->button()->hide();
cards.push_back(card);
}
Card* Deck::get_top_card() //returns the top card and removes it from the deck
{
Card* top_card = cards[cards.size()-1]; //holds the card
cards.erase(cards.end()-1); //deletes it from the deck
return top_card;
}
第一个版本:
Card& Deck::get_top_card() //returns the top card and removes it from the deck
{
Card top_card = cards[cards.size()-1]; //holds the card
erase_card(cards.size()-1); //deletes it from the deck
return top_card;
}
无效,因为您正在 return 引用范围结束的对象 top_card
。这个存储在堆栈中,可以很容易地覆盖。此外 CPU 可能会检查内存是否在栈顶上方访问导致崩溃。
这个版本也是非法的:
Card& Deck::get_top_card()
{
Card& top_card = cards[cards.size()-1]; //needed to create a reference.
erase_card(cards.size()-1);
return top_card;
}
自从这次您 return 引用位于堆上的向量的尖端并减小向量的大小。这是未定义的行为。
之所以有效,是因为在这种情况下,向量缓冲区不会重新分配,只是向量的大小会减一。结果引用指向有效的内存块(这可以防止崩溃),但它仍然是缓冲区溢出错误。
修复它的最可能的正确方法是来自 return 类型的兴奋剂参考:
Card Deck::get_top_card()deck
{
Card top_card = cards[cards.size()-1];
erase_card(cards.size()-1);
return top_card;
}
我怀疑你的 Card
是一个复杂的类型,很可能可以廉价地复制。