我将使用 ast_malloc 和 ast_realloc 函数拼接一长串。当我加载此模块时,它会发生段故障。怎么了?非常感谢!Asterisk的输出是这样的:
*** glibc detected *** asterisk: double free or corruption (fasttop): 0x00007fd56c000b20 ***
======= Backtrace: =========
/lib64/libc.so.6[0x33b9675f3e]
/lib64/libc.so.6[0x33b9678dd0]
/lib64/libc.so.6[0x33b967bd60]
/lib64/libc.so.6(realloc+0x158)[0x33b967c058]
/usr/lib64/asterisk/modules/app_test2.so(func+0x25)[0x7fd5330d19c5]
/usr/lib64/asterisk/modules/app_test2.so(+0xa92)[0x7fd5330d1a92]
asterisk[0x5175d5]
asterisk(ast_load_resource+0x34)[0x51a924]
asterisk[0x4c0f80]
asterisk(ast_cli_command_full+0x162)[0x4c3ad2]
asterisk(ast_cli_command_multiple_full+0x7c)[0x4c3cfc]
asterisk[0x450b9a]
asterisk[0x5c41cb]
/lib64/libpthread.so.0[0x33b9a07aa1]
/lib64/libc.so.6(clone+0x6d)[0x33b96e8aad]
代码如下所示:
#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/strings.h"
#include "asterisk/json.h"
#include "asterisk/res_odbc.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#define AST_MODULE "app_test"
void func(char* test, const char* src)
{
char* new_test = (char*)ast_realloc(test, strlen(test) + 32);
if ( NULL == new_test ){
ast_log(LOG_ERROR, "realloc errorn");
return;
}
test = new_test;
strcat(test, src);
}
static int load_module(void)
{
int i;
char* test;
char* src = "MingYuan";
test = (char*)ast_malloc(16);
for (i = 0; i < 6; i++) {
func(test, src);
}
ast_log(LOG_DEBUG, "n++++n%sn*******n", test);
ast_free(test);
return AST_MODULE_LOAD_SUCCESS;
}
static int unload_module(void)
{
return 0;
}
AST_MODULE_INFO(
ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "APP_TEST",
.load = load_module,
.unload = unload_module
);
func
中的strlen(test)
是没有意义的,因为你没有将字符串复制到test
中;这可能会导致不稳定的行为。我的建议是,test = (char*)ast_malloc(16);
之后,您可能想要类似strcpy(test, "");
或test[0] = ' ';
的东西......
由于 C 中的按值传递语义,这些更改对 func
的调用方不可见:
test = new_test;
strcat(test, src);
调用方将在指针变量中的某个位置有一个旧的、无效的指针值,这肯定会在以后再次使用时导致更不稳定的行为......
我的建议是,你开发函数,以便调用者分配内存;这不仅可以解决你的问题,而且会让你更灵活地分配内存,更频繁。