【问题标题】:Delete mulitple pointers in a method of another class删除另一个类的方法中的多个指针
【发布时间】:2016-08-03 14:14:05
【问题描述】:

我正在编辑一些开源游戏的代码,通常这些代码不会直接访问玩家或生物类;然而,它的参数Cylinder 在所有方面都处于食物链的顶端。

我的问题是我应该删除所有这些指针还是将它们设置为 NULL 完成后?

这是我编写的代码;它工作正常,但我不想让服务器因为悬空指针等问题而崩溃(对 C++ 来说还是有点新)。

bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/)
{
    if (cylinder == nullptr) {
        return false;
    }

    if (money == 0) {
        return true;
    }

    if (Creature *creature = cylinder->getCreature()) {
        if (Player *player = creature->getPlayer()) {
            uint64_t cash = player->getBankBalance();
            if (cash < money) {
                return false;
            }
            player->setBankBalance(cash - money);
        }
    }
    return true;
}

void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/)
{
    if (Creature *creature = cylinder->getCreature()) {
        if (Player *player = creature->getPlayer()) {
                player->setBankBalance(player->getBankBalance() + money);
        }
    }
}

【问题讨论】:

  • 没有new(内存分配),为什么要有delete(内存释放)?顺便说一句,指针不会被删除,可以删除由指针给出起始地址的内存块。但是只有动态分配的内存块才能被删除。
  • 那么将其设置为 null 怎么样?
  • 或者解引用指针,基本上我只是想知道我的做法是否正确。
  • 你是什么意思“将其设置为null”??您没有在您发布的代码中设置任何指向 null 的指针。
  • if` 语句中的变量声明是错误的(据我所知,除非 C++ 中有一些新语法)。在 if 语句之外(和之前)声明这些变量。

标签: c++ pointers dereference


【解决方案1】:

一般情况下(除非文档另有说明),如果您传递了一个指针,请不要使用 delete 对象。假设您没有获得该对象的所有权。

现代 C++ 帮助您避免需要知道您是否被授予所有权:您可能会获得 std::shared_ptr&lt;Cylinder&gt;std::unique_ptr&lt;Cylinder&gt; - 无论哪种方式,当智能指针超出范围时,都会为您处理删除。但通常情况下,您必须使用无法让您放心的库。

没有必要将在小范围内使用的任何指针(例如函数)清空。如果您将指针变量保留更长时间(也许在成员变量中),那么这样做可能有助于防止意外。由于 C++ 不是一种垃圾收集语言,因此将即将超出范围的指针归零没有任何好处。

【讨论】:

    【解决方案2】:

    delete 仅在您从游戏中获取Cylinder 对象时调用new 时才需要。可能没有,但您需要检查代码。

    设置为NULL 是在指向的对象已被删除(或有被删除的风险)时执行的操作。这是为了确保在一段时间后不会意外使用无效指针。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2012-10-26
      • 2020-07-02
      • 2015-08-07
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多