以下代码在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) );
答案 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 ,否则最终会导致内存泄漏。