在C ++中使用结构上的memset

时间:2010-05-05 14:09:08

标签: c++ memset memcmp

嘿伙计们。我正在为我的工作修复旧代码。它目前用C ++编写。他们将静态分配转换为动态,但没有编辑memsets / memcmp / memcpy。这是我的第一次编程实习,因为我的类似newbe的问题。

以下代码在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) );

4 个答案:

答案 0 :(得分:8)

是的,但前提是foo是POD。如果它有虚拟函数或其他任何远程C ++ ish,不要在它上面使用memset,因为它会遍及struct / class的内部。

你可能想做的而不是memset是给foo一个构造函数来显式初始化它的成员。

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

答案 1 :(得分:3)

你能吗?应该是。你应该?否。

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

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

编辑:需要注意的是,如果你已经拥有庞大的代码库,那么在开始对结构体进行子类化之前不要更改它。它现在可以正常工作。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

你可以 new foo (这是C ++中的标准方法)并实现一个初始化foo而不是使用 memset 的构造函数。

E.g。

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

    }

    int m_nInt;
};

另外,请不要忘记,如果您在完成对象后使用 new 来调用 delete ,否则最终会导致内存泄漏。