gpt4 book ai didi

c++ - 在 __tcf_0 中崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:06 25 4
gpt4 key购买 nike

在我们的应用程序中,我们在执行后观察到崩溃。堆栈跟踪显示崩溃是因为 cpp 文件中存在全局变量。生成的 valgrind 报告显示 invalid free/read/write 错误,这意味着它正在尝试删除不再有效的内存。

文件:crash.cpp

namespace abc
{
MutexClass obj; //A is a class
// remaining code

ChildClass::ChildClass():Parent(obj){}

}

然后我们将给定的变量放在一个未命名的命名空间中,我们不再崩溃,valgrind 也不会报告无效的读/写/错误:

文件:nocrash.cpp

namespace
{
MutexClass obj;
}

namespace abc
{
// remaining code
ChildClass::ChildClass():Parent(obj){}
}

以上示例是导致问题的类的精简版本。

我们不确定为什么将变量放在未命名的命名空间中可以消除此问题。它会改变清理顺序吗?我们尝试编写简单的代码,但我们观察到的清理顺序对于这两种情况都是相同的。

Mutex 对象作为参数传递给基类构造函数。 Mutex 对象的唯一目的是在基类构造函数中使用。 Mutex 对象未在代码的其他任何地方使用。

崩溃的 valgrind 报告

============================================= ==

线程 1:

大小 1 的无效读取

在 0x3A24C08260:pthread_mutex_destroy(在/lib64/libpthread-2.5.so 中)

通过 0x5ABE3DD:osl_destroyMutex (libuno_sal.so.3)

通过 0xECD69D1:osl::Mutex::~Mutex() (mutex.hxx:65)

通过 0xEF207F5:__tcf_0 (Dispose.cpp:27)

通过 0x3A24033354:退出(在/lib64/libc-2.5.so 中)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

地址 0xeb6bb88 是一个大小为 40 的空闲 block 中的 16 个字节

在 0x4A05B3E:空闲 (vg_replace_malloc.c:323)

通过 0x3A24033354:退出(在/lib64/libc-2.5.so 中)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

大小为 4 的无效写入

在 0x3A24C08272:pthread_mutex_destroy(在/lib64/libpthread-2.5.so 中)

通过 0x5ABE3DD:osl_destroyMutex(在 libuno_sal.so.3 中)

通过 0xECD69D1:osl::Mutex::~Mutex() (mutex.hxx:65)

通过 0xEF207F5:__tcf_0 (Dispose.cpp:27)

通过 0x3A24033354:退出(在/lib64/libc-2.5.so 中)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

地址 0xeb6bb88 是一个大小为 40 的空闲 block 中的 16 个字节

在 0x4A05B3E:空闲 (vg_replace_malloc.c:323)

通过 0x3A24033354:退出(在/lib64/libc-2.5.so 中)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

无效的 free()/delete/delete[]

在 0x4A05B3E:空闲 (vg_replace_malloc.c:323)

通过 0xECD69D1:osl::Mutex::~Mutex() (mutex.hxx:65)

通过 0xEF207F5:__tcf_0 (Dispose.cpp:27)

通过 0x3A24033354:退出(在/lib64/libc-2.5.so 中)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

地址 0xeb6bb78 是一个大小为 40 的 block 内的 0 字节 free'd

在 0x4A05B3E:空闲 (vg_replace_malloc.c:323)

通过 0x3A24033354:退出(在/lib64/libc-2.5.so 中)

by 0x3A2401D97A: (below main) (in/lib64/libc-2.5.so)

============================================= ==

Dispose.cpp :27 行定义了互斥变量。

如有任何帮助,我们将不胜感激

谢谢,

深渊

最佳答案

检查您的其他文件。您可能在 namespace abc 中有另一个名为 obj 的全局变量。更改为未命名的命名空间与 C 中的 static 具有相同的效果,这避免了名称冲突(如果可能发生这种情况,不同于 abc 的任何其他命名空间也将解决该问题)。这种错误通常会导致链接错误,但有时会发生奇怪的事情。

请注意,不会被其他文件使用的全局变量应位于未命名的命名空间中,以避免名称冲突。

关于c++ - 在 __tcf_0 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828984/

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