【发布时间】:2020-01-31 12:40:42
【问题描述】:
我正在尝试处理 C++ 中的内存管理,所以我一直在编写一个纸牌游戏(它有一张纸牌列表),但没有使用 vector。
假设我有一个 Cards 数组,如下所示:Card** cards。
现在,我想用另一张卡替换一张名为 Card* remove 的卡。
我认为我在cards 中的所有Card*s 都必须用new 创建,因为其他函数需要通过指针访问它们。因此,当我从cards 中删除一个元素时,我也应该delete 它。
但是,当我打电话给delete remove 时,它似乎弄乱了我的数组。具体来说,假设remove 恰好位于索引2。显然,在delete 之前,cards[2] == remove。但是,delete 之后,cards[2] 和 remove 都发生了变化,而指向 cards 的指针是一样的。
这可能不是一件坏事,但我很困惑为什么会这样。理想情况下,我可以删除位于remove 的堆中的内存,而无需修改cards。我错过了什么?
【问题讨论】:
-
您正在进行的练习或作业是关于指针和动态内存分配的吗?否则只需使用
std::vector<Card>。 -
我对问题所在感到困惑;您不(或确实)认为应该改变的究竟是(或没有)改变?另外,当您删除
remove时,您会调用delete remove还是delete cards[2]? -
从指针数组中“删除”元素的一种简单方法是根本不删除元素,而是将指针设置为空指针(即
cards[element_to_remove] = nullptr;)。否则,您可以创建一个少一个元素的新数组,并将剩余元素复制到新数组中。或者你可以在现有数组中将较高的元素向下复制一步。 -
@multitaskPro 那么你需要
delete是第一个当然。每个new都应该匹配一个delete。 -
我想知道您是否在调试模式下运行,并且编译器已添加指令以将废话写入任何被删除的指针,因此从该点对该指针的任何访问都会失败,而不是只有在其他东西随机覆盖了那部分堆内存后才会失败。
标签: c++ pointers memory-management heap-memory