gpt4 book ai didi

c - 也许资源没有发布?什么会导致这个?

转载 作者:太空狗 更新时间:2023-10-29 11:48:11 26 4
gpt4 key购买 nike

我正在做一个项目,我遇到了弹出以下堆栈跟踪的地步:

#0  0x0017c30c in _IO_flush_all_lockp () from /lib/libc.so.6
#1 0x0017d030 in _IO_cleanup () from /lib/libc.so.6
#2 0x0013e042 in exit () from /lib/libc.so.6
#3 0x00126bbe in __libc_start_main () from /lib/libc.so.6
#4 0x08049d11 in _start ()

(代码已删除,因为内存泄漏已解决。当然还有其他问题。不过,在将它们发布到此处之前,我会更加努力地追踪它们。:) 最初的问题可能与内存泄漏无关。 )

首先,我是否从初始堆栈跟踪中寻找正确的方向?在处理内存问题之前,我从未见过这个。有什么想法吗?

编辑:有人说这是由于 visual_mem_new0。该函数只是分配内存。它对插件->作者一无所知。

编辑:呃。 strdup 之前的 memcopy 填充内存。

编辑:好的,这消除了一次内存泄漏。我不相信最初的堆栈跟踪是关于内存泄漏的——例如它仍然存在。我相信它正在尝试释放一些资源。该程序的一部分使用了大量编译程序集(JIT 编译器),它在文件描述符之上使用 mmap 内存作为缓冲区。我正在关闭文件。我需要对内存映射做些什么吗?

不过,我会继续尝试清除这些内存泄漏。我最近做了一些与特定插件相关的事情。当我运行该插件时,该程序仅在关闭时挂起,该插件使用我提到的内存映射。我不确定它可能是什么。我做了一些小改动。最初我怀疑我跟踪引用的共享指针。它使用在整个 libvisual 中使用的相同系统,并且没有出现特定的内存泄漏。无论如何,我希望有人对此有一些线索。我想不出还有什么要补充的。

编辑:好的,在修订历史的帮助下追踪它。以下代码有什么问题?我不能像那样将输出复制到自身吗?

static inline int dump_stack(AvsCompilerContext *ctx)
{
AvsCompilerArgument *pa;
char output[2048];

snprintf(output, 2047, "\ncompiler: stackdump: Stack dump\n");
for (pa=(AvsCompilerArgument *)ctx->stack->base; pa < (AvsCompilerArgument *)ctx->stack->pointer; pa++) {
snprintf(stderr, 2047, "%scompiler: stackdump: [%2d] = ", output, (pa - (AvsCompilerArgument *)ctx->stack->base));
switch (pa->type) {
case AvsCompilerArgumentInvalid:
snprintf(output, 2047, "%sinvalid", output);
break;

case AvsCompilerArgumentConstant:
snprintf(output, 2047, "%s%.2f", output, pa->value.constant);
break;

case AvsCompilerArgumentIdentifier:
snprintf(output, 2047, "%s", pa->value.identifier);
break;

case AvsCompilerArgumentMarker: {
char *markers[] = { "invalid", "function", "argument", NULL };
snprintf(output, 2047, "%s--- %s marker ---", output, markers[pa->value.marker]);
break;
}

case AvsCompilerArgumentPrivate:
snprintf(output, 2047, "%sprivate", output);
break;

}
snprintf(output, 2047, "\n");
}

avs_debug(print(output));
return VISUAL_OK;
}

宏 avs_debug 什么都不做。我把它的内容注释掉了。

最佳答案

visual plugin_info new 调用 visual mem_new 0 正在分配内存,你需要先释放插槽,然后再在 visual_plugin_info_copy 中分配它们。

关于c - 也许资源没有发布?什么会导致这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2137588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com