为什么除非我使用 cout,否则我的值不正确?
Why is my value incorrect unless I use cout?
我正在为学校做一个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。考虑创建复制构造函数和/或赋值运算符。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么我的for循环不能正确获取argv
- 我是否不正确地集中了这些字符数组?
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 我只是想让我的代码正确编译
- 我删除不正确
- 无法让我的代码正确排序用户输入的数字数组(使用递归)
- 我如何才能根据我的代码正确设置这个贷款等式
- 如何避免int(xxx)_t之间的重叠,并使我的代码正确
- 循环QT C 的不正确总和
- 在这种情况下,为什么Sfinae对我来说不正确以及如何修复它
- Slicing vs Upcasting:我的理解正确吗
- 我无法让我的程序正确读取输入文件中的值(二维数组)
- 我的逻辑正确吗?它给出了分段错误
- Java最终字符串,C++等效.我的理解正确吗
- 我应该为我的不透明对象使用整数ID还是指针?
- 浮点数和由于舍入行为导致的不正确结果
- 如何为队列释放内存?我的不免费
- 为什么在这种情况下没有调用复制构造函数-我的推理正确吗?
- 是否有可能valgrind报告我的程序正确运行的致命错误?