我知道new
delete
与malloc
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);
}
答案 0 :(得分:11)
记忆是记忆,无论分配方式如何。
只要您将new
与delete
,new[]
与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);
}