【发布时间】:2011-06-02 04:10:40
【问题描述】:
我已经到处寻找答案,但似乎找不到。 (我对 C++ 的经验相当有限)
在我的库中,我释放了一个字符串。 (很神奇吧?)
这就是问题出现的地方。我有一个包含 char* 的结构,它可能分配在堆上,也可能不分配。虽然它是一个有效的指针,但它不能被释放。
IE
char* s1 = "A String";
char* s2 = (char*)memcpy(malloc(9), s1, 9);
free(s2);
free(s1);
将导致“free(s1);”上的错误(正如它应该) 因为 s1 实际上并不 需要 被释放,(它不在堆上)我如何以“可接受”的方式处理这个问题? (在类似的主题上,“让它崩溃”的答案似乎并不合理 IMO)
由于结构体不是由库单独创建的,因此无法保证使用 memcpy 之类的东西可以正确复制字符串。
鉴于这是一个 Windows 库,我无需担心使用 ISO C 的东西或标准 C 函数。
【问题讨论】:
-
最佳答案(恕我直言):使用不透明指针来保证
struct是 仅在库中创建。 (如果我使用 Windows,我会提供更多帮助。对不起。+1。) -
谢谢,如果最坏的情况发生,我可以这样做或使用 SEH(尽管后者会让我觉得我做错了什么)
-
鉴于这是一个 Windows 库,请将参数设为 BSTR。然后您要求用户正确分配它(使用
SysAllocString),并保证您使用匹配的释放器。其他方法只是......不好。如果您的用户有不同的编译器,那么即使他们确实使用了malloc,您也不能free()字符串 -
在释放字符串之前,我将在字符串上使用 (gasp) IsBadWritePtr...如果它是字符串文字,它将返回 true,并且我不会尝试释放字符串。