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*
类型的指针)。