由valgrind标识的内存泄漏,涉及使用malloc返回通过std :: string返回的字符串

问题描述 投票:0回答:1

我一直在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;
    }

特别是valgrind吐出enter image description here

有人可以解释原因,也可以提出解决方法吗?谢谢。

c++ memory-leaks valgrind
1个回答
1
投票
char *cstr = (char *) malloc(str.size());

此功能分配内存。如果返回的指针从未被free释放,则表明内存已泄漏。

建议解决方法?

取消分配您分配的所有内容。

如果您避免使用裸拥有的指针,这会更容易。请改用智能指针和容器。


就是说,我看不到valgrind提及图像中的任何内存泄漏。相反,它显示“无效读取的大小为1”。

 strcpy(cstr, str.c_str());

此行上的行为是不确定的。这总是溢出分配的缓冲区。必须至少分配str.size() + 1,以便空终止符适合缓冲区。


P.S。不要在C ++中使用malloc。

© www.soinside.com 2019 - 2024. All rights reserved.