C++ 重置结构

C++ Reset a struct

本文关键字:结构 C++      更新时间:2023-10-16

考虑我有一个结构如下。 我想重置这个结构。

struct StProduct {
int weight;
int price[100];
StProduct():
weight( 0 ),
price( ) {}
};

这种重置结构的方式在很多例子中给出,并且有效:

StProduct apple;
// some code ...
apple = StProduct();

现在我们将动态分配。像这样重置结构是否有效:

StProduct* pbanana = new StProduct();
// some code ...
*pbanana = StProduct();

还是涉及一些未定义的行为?

澄清问题的内在性质:

这个问题实际上只是上面的一个,可以这样回答。

人们似乎关心一个最小、完整和可验证的例子。

因此,让我补充以下解释:

我的 x86 单元测试使用上面的代码工作。 但是在带有gcc 4.7.6的嵌入式设备(STM32 F427(上,RTOS并将结构作为核心耦合存储器中的永久缓冲区,该行 *pbanana = StProduct((; 在每 100 毫秒调用的代码中会导致大约 30 分钟后崩溃,而注释掉此行会使设备运行 3 天。 这就是为什么我要问,上面的代码是否可能与未定义的行为相关联。由于显然不是,我很感谢评论,不得不在其他地方寻找 - 我的赌注是编译器错误。 如果有人知道我如何提供一个最小、完整和可验证的示例,而不涉及向每个人发送硬件,我会全力以赴。

您的代码本身不会导致内存损坏,但可能存在某种未初始化内存的工作。如果一切管理得当,您的方法就可以正常工作。

当您调用int price[100];时,它将分配price指向的 100 整数内存,但它不会说明内容。如果要确保它们在构造后为 0,则可以在构造函数中初始化数组:

StProduct() : weight(0) {
for(int i = 0; i < 100; ++ i)
price[i] = 0;
}

不过,您当前的方法确实有效,问题很可能出在代码的另一部分,它不处理内存未初始化,除非您假设数组初始化为 0。