我必须在C中编写一个DLL,其中包含一个返回特定字符串的函数(作为指向字符串的char缓冲区的指针)。 DLL中的函数将被重复调用,并将在不同的线程中执行。
正确的做法是在函数中分配char缓冲区,并在使用返回缓冲区后在调用者环境中释放分配的缓冲区。
// DLL function
char *getString() {
char *buffer = (char *)malloc(STRING_LEN);
// fill buffer with some string
return buffer;
}
不幸的是,在我的dll中调用函数的编程环境没有释放返回缓冲区的机制,因此导致内存泄漏。
如何在不产生内存泄漏的情况下返回字符串中的字符串?
答案 0 :(得分:2)
是否可以修改API以便调用者提供缓冲区?为maxStringLength
(或标题或函数中的宏)添加常量,以便调用者始终可以为返回字符串分配足够的空间。
// DLL
const size_t maxStringLength = STRING_LEN;
char *getString( char *buffer, size_t buffer_size) {
// fill buffer with some string
return buffer;
}
// calling code
char *my_buffer = malloc( maxStringLength);
if (my_buffer != NULL)
{
getString( my_buffer, maxStringLength);
// use string
free( my_buffer);
}
答案 1 :(得分:2)
DLL使用单独的堆,因此在dll中分配的内容必须由同一个dll解除分配。
正如hmjd所说,一个选项是将缓冲区返回给你的DLL,让它删除它。所以dll提供了释放功能。
你喜欢的另一个选择是调用程序提供内存本身。例如。你在调用程序中分配缓冲区并传入它,包括缓冲区的长度,并且如果缓冲区不够大,则使dll函数失败并具有所需的长度。像这样:
bool doStuff( char* buffer, int& len )
{
if ( len < tooSmall() )
{
len = requiredLength();
return false;
}
// fill the buffer here somehow
return true;
}
然后您可以正常管理调用程序中的缓冲区。这样做的一个优点是,如果有意义的话,调用程序很容易重用缓冲区。