7

我正在为我的工作修复旧代码。它目前是用 C++ 编写的。他们将静态分配转换为动态分配,但没有编辑 memset/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) );
4

4 回答 4

8

是的,但前提是 foo 是 POD。如果它有虚函数或其他任何远程 C++ 的东西,请不要在其上使用 memset,因为它会踩到结构/类的内部。

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

如果要使用new,别忘了对应的delete。更好的是使用 shared_ptr :)

于 2010-05-05T14:15:11.127 回答
4

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

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

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

编辑:对此的警告是,如果您已经拥有庞大的代码库,请在开始对结构进行子类化之前不要更改它。它像现在一样工作。

于 2010-05-05T14:14:23.583 回答
2

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

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

于 2010-05-05T14:12:00.457 回答
2

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

例如

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

    }

    int m_nInt;
};

也不要忘记在完成对象后是否使用new调用delete,否则最终会导致内存泄漏。

于 2010-05-05T14:18:22.637 回答