我一直在C ++库的python(ctypes
)接口中遇到“内存问题”。因此,我通过valgrind运行了C ++ / C API测试,这表明以下函数存在问题:
char *PhysicalEntity_str(PhysicalEntity *physical_entity_ptr, const char *format, const char *base_uri) {
std::string str = physical_entity_ptr->toTriples().str(format, base_uri);
char *cstr = (char *) malloc(str.size());
strcpy(cstr, str.c_str());
return cstr;
}
有人可以解释原因,也可以提出解决方法吗?谢谢。
char *cstr = (char *) malloc(str.size());
此功能分配内存。如果返回的指针从未被free
释放,则表明内存已泄漏。
建议解决方法?
取消分配您分配的所有内容。
如果您避免使用裸拥有的指针,这会更容易。请改用智能指针和容器。
就是说,我看不到valgrind提及图像中的任何内存泄漏。相反,它显示“无效读取的大小为1”。
strcpy(cstr, str.c_str());
此行上的行为是不确定的。这总是溢出分配的缓冲区。必须至少分配str.size() + 1
,以便空终止符适合缓冲区。
P.S。不要在C ++中使用malloc。