大家好。我正在为工作修复较旧的代码。它目前用C ++编写。他们将静态分配转换为动态,但没有编辑memsets/memcmp/memcpy。这是我的第一个编程实习,因此我的新闻般的问题很裸露。

以下代码在C中,但我想在C ++中使用它(我读到Malloc在C ++中不是很好的实践)。我有两种情况:首先,我们创建了F。然后,您使用&f来填充零。第二个是指针 *pf。我不确定如何将PF设置为所有0,例如C ++中的上一个示例。

你能做吗 pf = new foo 而不是malloc,然后致电 memset(pf, 0, sizeof(foo))?

struct foo { ... } f;
memset( &f, 0, sizeof(f) );

//or

struct foo { ... } *pf;
pf = (struct foo*) malloc( sizeof(*pf) );
memset( pf, 0, sizeof(*pf) );
有帮助吗?

解决方案

是的,但是只有foo是豆荚。如果它具有虚拟函数或其他任何远程C ++ ISH,请不要在其上使用memset,因为它会踩在结构/类的内部。

您可能想做的而不是memset的工作是为FOO提供一个明确初始化其成员的构造函数。

如果要使用新的,请不要忘记相应的删除。更好的是使用shared_ptr :)

其他提示

你可以吗?很可能是。你应该?不。

虽然它可能会起作用,但您正在失去构造函数为您构建的状态。除此之外,当您决定实现此结构的子类时会发生什么?然后,您将失去C ++ OOP提供的可重复使用代码的优势。

相反,您应该做的是创建一个为您初始化成员初始化的构造函数。这样,当您以后在线上旋转该结构时,只需使用此构造函数来帮助您构建子类。这是免费,安全的代码!用它!

编辑:警告是,如果您已经拥有巨大的代码库,请不要更改它,直到您开始对结构进行亚分。它像现在一样工作。

是的,那会起作用。但是,我认为Malloc一定是不好的做法,而我不会改变它只是为了改变它。当然,您应该确保始终正确匹配分配机制(new-> delete,malloc-> free等)。

您也可以在结构中添加一个构造函数,并使用它来初始化字段。

你可以 新的foo (就像C ++中的标准方式一样)并实现一个构造函数,该构造函数初始化foo而不是使用 memset.

例如

struct Something
{
    Something()
        : m_nInt( 5 )
    {

    }

    int m_nInt;
};

也不要忘记您是否使用 新的 打电话 删除 完成对象后,否则您最终会出现内存泄漏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top