删除/释放由 malloc 分配并由 new [重复] 重用的内存

Posted

技术标签:

【中文标题】删除/释放由 malloc 分配并由 new [重复] 重用的内存【英文标题】:delete/free memory allocated by malloc and reused by new [duplicate] 【发布时间】:2019-03-07 11:56:22 【问题描述】:

在以下程序中,new 重用了由malloc 分配的内存。但是如何释放内存呢? free 还是 delete?如何调用析构函数?

#include <iostream>

struct A

    A()  
    ~A() 
;
int main()

    void* p = malloc(sizeof(A));
    A* pa = new (p) A();

    // codes...


    delete pa;
    // pa ->~A();
    // free(p);

new 重用 malloc 内存是否安全?以及如何释放内存?

【问题讨论】:

你的情况应该使用free() @πάνταῥεῖ 一个类可能需要调用析构函数。如何调用析构函数?在释放之前明确?还是解放后? 【参考方案1】:

new (p) A() 是placement new,它不分配内存,只调用构造函数。

在placement new 返回的指针上调用常规delete 是未定义的行为。

要在此处正确解除分配,您需要调用析构函数,然后调用free 内存:

pa->~A(); // or, in C++17 std::destroy_at(pa);
free(pa);

【讨论】:

可以在需要显式调用析构函数的任何地方使用destroy_at 吗? @nano 我不明白为什么不这样做。除非你想避免#include &lt;memory&gt;

以上是关于删除/释放由 malloc 分配并由 new [重复] 重用的内存的主要内容,如果未能解决你的问题,请参考以下文章

动态内存分配malloc与new的区别

new/delete

new/delete

malloc与new

malloc和new的区别

new/malloc的差别