簡體   English   中英

內存泄漏而沒有分配任何內存?

[英]Memory leak without allocating any memory?

我正在為C ++類進行編碼分配。 當我運行程序時,我似乎正在處理內存泄漏問題,這很奇怪,因為我沒有在代碼中顯式分配任何內存。 我在gdb下運行了該程序,似乎為Deck對象運行析構函數時該程序崩潰了。 我試圖單步執行代碼,但是當我這樣做時,最終得到了大量與向量有關的.h文件。 然后突然停止。 我嘗試去助教尋求幫助,但他們似乎和我在這個問題上一樣困惑。

# include <stdlib.h>
# include <time.h>
# include <iostream>
# include <vector>
# include <stdio.h>

using namespace std;

//function signatures
float bustProbability (const int);


class Deck
{
public:
    //data members
    vector <int> cardArray;
    vector <int> wasteCards;

    //constructor
    Deck();

    //methods
    void shuffleDeck();
    void populateDeckWithCards();
    void removeCopyCards();

    int dealCard();
    int remainingCards();
    void showCards();
};

void Deck::removeCopyCards() {
    for (unsigned int i = 0; i < wasteCards.size(); i++) {
        bool removedCopy = false;
        for (unsigned int j = 0; j < cardArray.size() && removedCopy == false; j++) {
            if (cardArray[j] == wasteCards[i]) {
                cardArray.erase (cardArray.begin() + j - 1);
                removedCopy = true;
            }
        }
    }
}

int Deck::dealCard() {
    if (remainingCards() > 0) {
        int tmp = cardArray.back();
        wasteCards.push_back(tmp);
        cardArray.pop_back();
        return tmp;
    }

    else {
        populateDeckWithCards();
        removeCopyCards();
        shuffleDeck();
        //shuffle method
        int tmp = cardArray.back();
        cardArray.pop_back();
        return tmp;
    }
}

void Deck::populateDeckWithCards() {
    //populate regular cards into array
    for (int i = 2; i <= 10; i++) {
        for (int j = 0; j < 4; j++) {
            cardArray.push_back(i);
        }
    }

    //populate J, Q, K into array
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            cardArray.push_back(10);
        }
    }

    //populating array with Aces... treating them as special case '100'
    for (int i = 0; i < 4; i++) {
        cardArray.push_back(100);
    }

    return;
}

void Deck::showCards() {
    for (unsigned int i = 0; i < cardArray.size(); i++) {
        cout << cardArray[i] << endl;
    }
}

Deck::Deck() {
    wasteCards.clear();
    cardArray.clear();
    populateDeckWithCards();
    shuffleDeck();
}

void Deck::shuffleDeck() {
    int n = cardArray.size();

    for(int a = n-1; a > 0; a--) {
        int min = 0;
        int max = a;
        int j = min + rand() / (RAND_MAX / (max-min + 1) + 1);

        int tmp = cardArray[a];
        cardArray[a] = cardArray[j];
        cardArray[j] = tmp;
    }

    return;
}

int Deck::remainingCards() {
    return cardArray.size();
}


class Player {
public:
    //data members
    vector <int> playerHand;

    //constructor
    Player();

    //methods
    bool isBust();
    int count();
    void hit(Deck&);
    void stand();
    bool muckHand();
    void showHand();
};

Player::Player() {
    playerHand.clear();
}


void Player::showHand() {
    for (unsigned int i = 0; i < playerHand.size(); i++) {
        cout << playerHand[i] << endl;
    }

    return;
}


int Player::count() {
    int handCount = 0;

    for (unsigned int i = 0; i < playerHand.size(); i++) {
        if (playerHand[i] != 100)
            handCount += playerHand[i];

        else {
            if (playerHand[i] == 100) {
                if ((handCount) > 11) {
                    handCount += 1;
                }

                else
                    handCount += 10;
            }
        }
    }

    return handCount;
}

bool Player::isBust() {
    if (count() > 21)
        return true;

    else
        return false;
}

void Player::hit(Deck& d) {
    playerHand.push_back(d.dealCard());
}

void Player::stand() {
    return;
}

bool Player::muckHand() {
    playerHand.clear();
    return true;
}


float bustProbability (const int threshHold) {
    int threshHoldReached = 0;
    Deck myDeck;
    Player myPlayer;
    Player dealer;

    for (int i = 0; i < 10000; i++) {
        myPlayer.hit(myDeck);
        dealer.hit(myDeck);
        myPlayer.hit(myDeck);
        dealer.hit(myDeck);

        while (myPlayer.count() < threshHold) {
            myPlayer.hit(myDeck);
        }

        if (!(myPlayer.isBust())) {
            ++threshHoldReached;
        }

        myDeck.wasteCards.clear();
        myPlayer.muckHand();
        dealer.muckHand();
    }

    float bustFraction = float(threshHoldReached)/float(10000);
    return bustFraction;
}

int main () {
    cout << "blackjack simulation" << endl;
    srand((unsigned int)time(NULL));
    cout << bustProbability(19);

    return 0;
}

非常遺憾,我只發布了我的代碼,但是我花了4天的時間解決這個問題,我什至無法開始找出問題所在。

至少有線

cardArray.erase (cardArray.begin() + j - 1);

j = 0情況下這似乎是可疑的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM