检查是否可以释放指针

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函数.

Jam*_*lis 6

在C++中,你根本不应该担心这一点.使用std::string并让它自动管理内存. 不要手动管理内存.

如果您要手动执行此操作,则需要自行管理资源

  • 让图书馆的用户自己管理记忆,或者
  • 要求用户告诉你如何管理内存,或者
  • 告诉用户你将如何管理内存然后期望用户遵守.


Ben*_*igt 2

由于这是一个 Windows 库,因此将参数设为BSTR. 然后,您要求用户正确分配它(使用SysAllocString),并且保证使用匹配的释放器

其他方法只是……糟糕。如果您的用户有不同的编译器,那么free()即使他们确实使用了malloc.

[注:根据 James 的要求转换而来的评论,这实际上只是他最后建议的 Windows 特定案例]

进一步说明:BSTR 是 Unicode。我记得看到过一种使用 BSTR 分配器来存储 ANSI 字符串的方法,似乎就是这样SysAllocStringByteLen做的,但请注意,对于熟悉 BSTR 的人来说,将 ANSI 数据放入 BSTR 中是非常违反直觉的。