C++ malloc和free与new和delete

C++ malloc和free与new和delete,c++,C++,您好,我读到new和delete比malloc()和free()好,因为free()不调用析构函数,而delete调用析构函数。。。 例如: #包括 使用名称空间std; 类字符串 { 公众: 字符串(); String(const String&){coutnew调用构造函数,malloc()不调用构造函数。delete调用析构函数,free()不调用。如果所讨论的类在内部分配内存,那么是的,您可能会遇到内存泄漏 如果必须使用 MARROCKE()/和 For(),代码>(并且在C++中,你确

您好,我读到
new
delete
malloc()
free()
好,因为
free()
不调用析构函数,而
delete
调用析构函数。。。 例如:

#包括
使用名称空间std;
类字符串
{
公众:
字符串();

String(const String&){cout
new
调用构造函数,
malloc()
不调用构造函数。
delete
调用析构函数,
free()
不调用。如果所讨论的类在内部分配内存,那么是的,您可能会遇到内存泄漏

如果必须使用<代码> MARROCKE()/<代码>和<代码> For(),代码>(并且在C++中,你确实不应该),你必须使用<强>放置新< /强>调用构造函数,并调用析构函数,例如:

pStr = static_cast<String*>(malloc(4 * sizeof(String)));
if (pStr)
{
    for (int i = 0; i < 4; ++i)
        new (&pStr[i]) String;
    ...
    for (int i = 3; i >= 0; --i)
        pStr[i].~String();
    free(pStr);
}

new
调用构造函数,
malloc()
不调用。
delete
调用析构函数,
free()
不调用。如果所讨论的类在内部分配内存,那么是的,您可能会遇到内存泄漏

如果必须使用<代码> MARROCKE()/<代码>和<代码> For(),代码>(并且在C++中,你确实不应该),你必须使用<强>放置新< /强>调用构造函数,并调用析构函数,例如:

pStr = static_cast<String*>(malloc(4 * sizeof(String)));
if (pStr)
{
    for (int i = 0; i < 4; ++i)
        new (&pStr[i]) String;
    ...
    for (int i = 3; i >= 0; --i)
        pStr[i].~String();
    free(pStr);
}

<>是的。对于C++对象,必须使用“New”和“Dele``”“New”来确保对象的构造函数被调用,并且“DELATE”将确保对象的析构函数被调用。 malloc()和free()是内存分配例程(来自C世界),但不会调用构造函数或析构函数,可能析构函数将取消分配该内存,但为了确保这一点,必须使用“delete”以便调用析构函数

另外,不要将new/delete与malloc/free混用。也就是说,不要在同一对象上使用'new'后跟free(),或者在malloc()后跟'delete'。这样做行不通


仅供参考,“new”可以用malloc()实现,然后调用对象的构造函数。“delete”可以用free()实现事实上,如果你写一个对象的析构函数。如果你写的是类特定的“新”和“删除”方法,那就是你要怎么做的。

是的。对于C++对象,你必须使用“Neo”和“Dele``”。“New”将确保对象的构造函数被调用,并且“DELATE”将确保对象的析构函数被调用。 malloc()和free()是内存分配例程(来自C世界),但不会调用构造函数或析构函数,可能析构函数将取消分配该内存,但为了确保这一点,必须使用“delete”以便调用析构函数

另外,不要将new/delete与malloc/free混用。也就是说,不要在同一对象上使用'new'后跟free(),或者在malloc()后跟'delete'。这样做行不通


仅供参考,“new”可以用malloc()实现,然后调用对象的构造函数。“delete”可以用free()实现,然后调用对象的析构函数。事实上,如果您编写特定于类的“new”和“delete”方法,这正是您要做的。

我猜您的意思是“new and delete”“代码> MalCal和 Fux<代码>都是C函数,而不是C++函数。除非你实际上是在分配C库的东西,否则不应该用C++代码。在这种情况下,代码< < < <代码> >删除>代码>应该是很好的。这意味着应该调用的析构函数不是。这会导致B的定义不明确。ehaviour。另外,不要专注于内存泄漏。类可以管理非内存资源。而且,
free()
不会导致内存泄漏,使用
free()的糟糕程序员在C++代码中,不仅代码<>自由< /COD>不调用对象的析构函数,而 MaloC 不会调用对象构造函数。我猜你是指“新建和删除”。“代码> MalCal和 Fux<代码>都是C函数,而不是C++函数。除非你实际上是在分配C库的东西,否则不应该用C++代码。在这种情况下,代码< < < <代码> >删除>代码>应该是很好的。这意味着应该调用的析构函数不是。这会导致B的定义不明确。也不要固执于内存泄漏。类可以管理不是内存的资源。此外,<代码> For()>代码>不会导致内存泄漏,在C++代码中使用“<代码>”(代码)>的坏程序员。不仅代码< >免费>代码>不调用对象的析构函数,而<代码> MaloC 不会调用对象构造函数。
pStr = static_cast<String*>(malloc(4 * sizeof(String)));
if (!pStr)
    throw std::bad_alloc("");

int numConstructed = 0;
try
{
    for (int i = 0; i < 4; ++i)
    {
        new (&pStr[i]) String;
        ++numConstructed;
    }
}
catch (const std::exception &)
{
    for (int i = numConstructed-1; i >= 0; ++i)
        pStr[i]).~String();
    throw;
}

...

for (int i = numConstructed-1; i >= 0; --i)
    pStr[i].~String();
free(pStr);