C ++重置结构

时间:2017-08-19 23:09:16

标签: c++ embedded

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

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单元使用上面的代码进行测试。 但是在嵌入式设备(STM32 F427)上使用gcc 4.7.6,一个RTOS并将结构作为核心耦合内存中的永久缓冲区,该行     * pbanana = StProduct(); 在每100毫秒调用的代码中,大约30分钟后会导致崩溃,同时评论此行会使设备运行3天。 这就是为什么我问,如果上面的代码可能与未定义的行为相关联。由于它显然不是,我感谢评论,并且必须看看其他地方 - 我的赌注是编译错误。 如果有人知道如何提供一个不涉及向所有人发送硬件的最小,完整和可验证的示例,我全心全意。

1 个答案:

答案 0 :(得分:1)

您的代码本身不会导致内存损坏,但可能会对未初始化的内存进行某种操作。如果一切都得到妥善管理,你的方法就可以了。

当你致电int price[100];时,它将分配price指向的100个内存,但它没有说明内容。例如,如果要确保它们在构造之后为0,则可以在构造函数中初始化数组:

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

你当前的方法确实有效,问题最有可能发生在代码的另一部分,它没有处理内存未初始化,除非你假设数组初始化为0。