传递使用" new"分配的内存是否安全?到C库?

时间:2015-02-11 21:00:09

标签: c++ c memory libraries

我知道new deletemalloc free不相容。

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

当我将内存传递给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);
}

3 个答案:

答案 0 :(得分:11)

记忆是记忆,无论分配方式如何。

只要您将newdeletenew[]delete[]malloc / calloc与{{1}相匹配即可(也free),你没事。

如果你考虑一下,即使C在不同的地方分配内存,它也可以正常工作---如果一个库需要realloc,你可以在堆栈上或堆上分配它(或者在一些全球存储中):

int

答案 1 :(得分:8)

  

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

完全没有。内存是相同的,所以如果你提供一种安全的方式来释放内存,你绝对可以将该内存传递给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 ++库动态分配内存。

答案 2 :(得分:4)

它是任何其他内存,只要C库不free它就是安全的。

请注意,在您的示例中,您还可以在堆栈上使用没有分配或释放函数的内存:

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