C++ 重置结构
C++ Reset a struct
考虑我有一个结构如下。 我想重置这个结构。
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。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?