c++ - malloc: *** 对象错误:未分配正在释放的指针

标签 c++ malloc new-operator delete-operator

我在运行代码时不断收到此错误。我不确定为什么我一直收到此错误,因为我在使用 new 运算符分配的两个对象上调用了 delete

我已经尝试在 Xcode 中运行它,但我得到了一个thread 1: signal SIGABRT error

PokerV2.cpp

int main() {    
    bool game_flag = true;

    Poker_Game game1;

    game1.initialise_game();

    game1.game_run();

    while (game_flag) { 
        char input = 'a';
        game_flag = false;
        game1.game_run(game1.get_current_players());
        std::cout << "Press 'y' to continue";
        std::cin >> input;
        if (input == 'y') {
            game_flag = true;
        }
    }
}

poker_game_class.hpp

void Poker_Game::game_run() {
    int lowest = 10;
    int num = 0;
    // Create the deck and table dynamically
    Deck *deck = new Deck();
    Table *table = new Table(_player_num);

    deck->deal_cards(table->get_all_players(), _player_num, *table);

    for (int i = 0; i < 4; i++) {
        table->set_game_flag(i);
        table->set_highest_bet(0);

        for (int z = 0; z < table->get_player_num(); z++) {
            table->players_turn(z);
        }
    }

    for (int i = 0; i < table->get_player_num(); i++) {
        if (table->get_player(i).calculate_score(*table) < lowest) {
            num = i;
        }
    }

    std::cout << "The winner is player: " << num << "\n";
    std::cout << "The winner has won: £" << table->get_pot() << "\n";

    //Add total pot to players cash

    float current_balance = table->get_player(num).get_balance();
    float balance_after_win = current_balance + table->get_pot();

    table->get_player(num).set_balance(balance_after_win);

    std::cout << "Winners balance: £" << table->get_player(num).get_balance();

    this->Current_players = table->get_all_players();

    delete deck;
    delete table;
}

game_run函数在删除decktable时出现错误。

The output from the terminal

下面是链接的 GitHub 存储库

https://github.com/mbh1620/PokerV2/tree/master/PokerV2

最佳答案

你这里有问题:

Player * Table::get_all_players()
{
    return Players;
}

您正在返回指向 Poker_Game 的指针(和所有权)当它调用这个函数时:

    // One place you call it from.
    set_current_players(table -> get_all_players());

问题是两个对象现在声称拥有 Players并且都调用 delete []在他们的指针上。

Poker_Game::~Poker_Game()
{
    delete[] Current_players;
}
Table::~Table()
{
    delete[] Players;
}

没有说这是你唯一的错误。

您基本上已经陷入应用程序中不良所有权语义的陷阱。在 C++ 中,我们通过使用特定类型和语言构造来显式标记所有权来解决此问题(与 C 不同)。通过这种方式,我们明确知道谁拥有一个对象,因此谁负责删除它们。

您的问题可以通过做几件事轻松解决。

  1. 不要动态分配数组。
    使用 std::vector<>为您管理分配。
  2. 不要动态分配生命周期不长于函数的对象。
    只需使用局部变量并让范围规则处理它。
  3. 如果您必须动态分配一个对象,请使用智能指针。
    std::unique_ptr 和 std::shared_ptr 很好地管理分配对象的内存。
  4. 如果您将一个对象传递给另一个对象(并且不传递所有权),则通过引用(而不是指针)传递。
    这告诉其他类他们不拥有该对象,因此不应删除它。

一个简单的生活规则是“关注点分离”。

一个类要么是业务逻辑,要么是资源管理。所以你的类应该要么处理扑克的逻辑,要么处理管理你分配的内存的逻辑(而不是两者)。所以任何处理扑克牌的类都不应该调用 new/delete 处理 new/delete 的类不应该有扑克牌逻辑。

现在标准库提供了很多资源管理代码,所以你不需要,你可以简单地使用现有代码并专注于你的扑克逻辑。如果在游戏运行后您认为标准资源管理效率不够高,您可以将其作为一项单独的任务进行升级。

关于c++ - malloc: *** 对象错误:未分配正在释放的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56938324/

相关文章:

c - 尝试输入时 C 出现段错误

c - 在实时应用程序中使用 malloc

c - 不使用标准库函数的字符串比较

c++ - malloc 中数字对象的用法

c++ - iPhone OpenGL ES 2.0 渲染到纹理会乘以颜色值而不是相加

c++ - 为什么 std::generate 不像 std::for_each 那样返回状态?

c++ - 在不同的属性表中定义用户宏

c++ - 是否可以将 C++ 智能指针与 C 的 malloc 一起使用?

PHP 创建一个新对象还是使用现有对象(如果已设置)?

c++ - 如何隐藏窗口的菜单栏?