C++ 使用“传递分配的内存是否安全?”;新";到C库?

C++ 使用“传递分配的内存是否安全?”;新";到C库?,c++,c,memory,libraries,C++,C,Memory,Libraries,我知道newdelete与mallocfree不兼容 这是否意味着我应该避免将new用于C库将使用的内存 void func() { int *p = new int(42); // Should I insist on using malloc for p if this function is a part // of a C library? lib_func(p); } 当我将内存传递到C库时,如果使用new而不是malloc,会出现什么问题 void

我知道
new
delete
malloc
free
不兼容

这是否意味着我应该避免将
new
用于C库将使用的内存

void func()
{
    int *p = new int(42);

    // Should I insist on using malloc for p if this function is a part
    // of a C library?
    lib_func(p);
}
当我将内存传递到C库时,如果使用
new
而不是
malloc
,会出现什么问题

void func()
{
    int *p = new int(42);

    // Should I insist on using malloc for p if this function is a part
    // of a C library?
    lib_func(p);
}

内存就是内存,不管它是如何分配的

只要您将
new
delete
匹配,
new[]
delete[]
匹配,
malloc
/
calloc
free
匹配(同样也是
realloc
),您就可以了

仔细想想,即使是C也会在不同的位置分配内存,而且效果很好——如果库需要
int
,则可以在堆栈或堆(或某些全局存储)上分配它:

这是否意味着我应该避免使用new作为C库将使用的内存

void func()
{
    int *p = new int(42);

    // Should I insist on using malloc for p if this function is a part
    // of a C library?
    lib_func(p);
}
一点也不。内存是相同的,所以如果您提供了一种安全的方法来释放内存,那么您肯定可以将该内存传递给C库

int *p = new int(42);
lib_func(p);
delete p;
下面是另一个例子:

extern "C" {
    int* make_buffer(size_t sz) {
        return new int[sz];
    }
    void use_buffer(int* buf) {
        ... // do something
    }
    void free_buffer(int* buf) {
        delete[] buf;
    }
}

<>上述代码允许您的C代码请求动态地从C++库分配内存。

< P>它是内存,其他的都是安全的,只要C库不<代码>免费< /COD>它就安全。 请注意,在您的示例中,还可以使用堆栈上的内存,该堆栈没有分配或解除分配功能:

void func()
{
    int p;
    lib_func(&p);
}

@pm100它的定义非常明确。标准要求的全部内容都写在这里。关于堆栈溢出,我们不提供“当然它只是工作”的答案。断言这实际上是非常粗糙的。所以C++标准的某些部分说新的结果与MALOC的结果(除了构造函数调用副作用)@ PM100:在某种程度上是的。它位于相同的内存空间中(事实证明,
new
malloc
都可以创建
T*
类型的指针)。