指针数组中的值被覆盖
Values being overwritten in array of pointers
我是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>
的向量,并将你的对象保存在那里。
相关文章:
- C++找出覆盖同一行的数组
- C++/SDL 如何覆盖数组?
- 当将多个TypedArrayContents数组加载到V8数组中时(数组数组)时,最后一个元素将覆盖所有元素
- 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值
- 覆盖数组元素时如何调用构造函数
- c ++ 我的 char* 数组被最后一个添加的元素覆盖
- 初始值设定项列表覆盖动态多维数组的内存
- 编写一个函数,该函数将覆盖主函数数组中的值
- 将用户输入存储到2D数组中时要覆盖的值
- 从函数更新(覆盖)和显示数组
- 覆盖和扩展数组或矩阵,而不在特征中定义其大小
- 用静态数组覆盖指针属性
- 用较大的数组覆盖数组
- c++中的数组和覆盖-可以重用同一个对象吗?
- 我的数组值是如何被覆盖的
- 溢出字符数组每次都覆盖完全相同的字符串-为什么?
- 分配结构数组后覆盖的内存
- 为什么 std::getline 会覆盖包含文件名的字符数组
- 覆盖无符号字符数组中的值时出错
- 指针数组中的值被覆盖