为什么除非我使用 cout,否则我的值不正确?

Why is my value incorrect unless I use cout?

本文关键字:我的 不正确 非我 cout 为什么      更新时间:2023-10-16

我正在为学校做一个C++作业,我遇到了一个特殊的问题。这很可能是内存损坏或其他什么,但由于我真的很平庸C++我不知道如何解决它。

void Inventory::addItem(Item *item, const int stackCount) {
//find the item
Item *fi = findItem(item->id);
if(fi == nullptr)
{
Item *newItem = (Item *)malloc(sizeof(Item));
//std::cout << stackCount << std::endl;
memcpy(&newItem, &item, sizeof(Item));
newItem->stack = stackCount;
current.push_back(newItem);
}
}

我有这段代码,它将 Item 的属性复制到另一个项目。这工作正常,它承载了所有内容。除了stackCount变量发生了一些奇怪的事情。

有一个注释cout,并且注释掉了堆栈计数值是错误的。它将在32k左右。

如果没有注释掉,则值将是正确的!哪个是1!(我正在另一个函数中对此进行测试(

当放在memcpy语句后面时,该值总是错误的。这当然让我相信这确实是内存损坏。

所以我真的很困惑。c++到底在做什么?

memcpy(&newItem, &item, sizeof(Item));

你在这里说的是 从item的地址 (又名指向Item的指针的指针( 复制到newItem的地址 ,也就是另一个指向Item的指针的指针。

由于这两个都是堆栈变量,我猜sizeof(Item) != sizeof(Item**),您在此处调用未定义的行为。

StackSize 变量仅在打印时起作用的原因纯粹是你的运气;编译器很可能只是在堆栈上移动一些变量以尝试优化堆栈/寄存器的使用,并将变量移出要在此过程中被覆盖的区域。

既然你使用的是C++,你首先不应该使用memcpy。改为编写复制构造函数和operator=来复制Item值。

Memcpy 应该得到一个目的地和源的地址。 您正在传递"地址到地址"。 改变:

memcpy(&newItem, &item, sizeof(Item));

memcpy(newItem, item, sizeof(Item));

此外,正如@Bathsheba和@Some程序员和@yksisarvinen所说,你不应该使用malloc。考虑创建复制构造函数和/或赋值运算符。