Jam*_*mes 5 c++ memory free pointers
我到处寻找答案,但似乎找不到答案.(我对C++的经验相当有限)
在我的库中,我释放了一个字符串.(太棒了,对吧?)
这就是出现问题的地方.我有一个包含char*的结构,可以在堆上分配,也可以不分配.虽然它是一个有效的指针,但它无法释放.
IE
char* s1 = "A String";
char* s2 = (char*)memcpy(malloc(9), s1, 9);
free(s2);
free(s1);
Run Code Online (Sandbox Code Playgroud)
将导致"free(s1)"错误; (因为它应该)因为s1实际上不需要被释放,(它不在堆上)我如何以"可接受"的方式处理它?(在类似的主题上,"让它崩溃"的答案似乎不合理IMO)
因为结构不仅仅是由库创建的,所以不可能保证使用memcpy之类的东西正确复制字符串.
看到这是一个Windows库,我不需要担心使用ISO C的东西或标准的C函数.
由于这是一个 Windows 库,因此将参数设为BSTR. 然后,您要求用户正确分配它(使用SysAllocString),并且保证使用匹配的释放器。
其他方法只是……糟糕。如果您的用户有不同的编译器,那么free()即使他们确实使用了malloc.
[注:根据 James 的要求转换而来的评论,这实际上只是他最后建议的 Windows 特定案例]
进一步说明:BSTR 是 Unicode。我记得看到过一种使用 BSTR 分配器来存储 ANSI 字符串的方法,似乎就是这样SysAllocStringByteLen做的,但请注意,对于熟悉 BSTR 的人来说,将 ANSI 数据放入 BSTR 中是非常违反直觉的。