指针数组中的值被覆盖

Values being overwritten in array of pointers

本文关键字:覆盖 数组 指针      更新时间:2023-10-16

我是Java小伙,想用c++解决离散背包问题。然而,我在使用指针方面遇到了麻烦。我有一个带有字段

的对象
Item ** items;

表示可供选择的项数组。我还创建了一个方法来添加一个项目,其工作原理类似于插入排序(至少我希望如此)。

void Knapsack::addItem(Item item) {
int k = itemCount - 1;
if (this->items[k] != NULL) {
    return;
}
while (k > 0 && this->items[k - 1] == NULL) {
    k--;
}
if (k == 0) {
    this->items[0] = &item;
} else {
    int i = 0;
    while (i < k && item < *(this->items[i])) {
        i++;
    }
    for (int n = k; n > i; n--) {
        this->items[n] = this->items[n - 1];
    }
    this->items[i] = &item;
}
}
之后,在主程序中,我通过 调用方法
knapsack->addItem(*(new Item(values.at(0), values.at(1))));

values是int型的向量。该方法本身似乎工作得很好,但是,调试器显示,每次我用new Item调用该方法时,已经放在我的数组中的先前值被设置为与新项相同的值。(例如,如果items[0]的值为5,并且我用值为10的项调用该方法,则items[0]立即被设置为10)。

为什么值被覆盖?每次调用该方法时,我都会创建一个新对象。

编辑:

通过替换 修复

问题

this->items[0] = &item;
this->items[i] = &item;

this->items[0] = new Item(item.getWeight(), item.getValue());
this->items[i] = new Item(item.getWeight(), item.getValue());

第二个编辑:

答案显示了更好的(可能是正确的)方法。现在该函数接受指针而不是对象。

void Knapsack::addItem(Item * item);
this->item[i] = item;
knapsack->addItem(new Item(values.at(0), values.at(1)));

你在addItem函数的数组中存储一个指向Item对象临时副本的指针,一旦函数返回临时对象将被销毁,你将留下一个无效的指针。确保在堆上分配一个Item对象,并传递一个指针给你的addItem函数,或者只是使用一个类型为std::vector<Item>的向量,并将你的对象保存在那里。