gpt4 book ai didi

c++ - try __finally block 中可能的堆栈损坏

转载 作者:行者123 更新时间:2023-11-30 04:17:01 25 4
gpt4 key购买 nike

我在我正在处理的新模块中遇到堆栈损坏问题,该模块是大型遗留项目的一部分。我的代码是使用 Borland C++Builder 5.0 用 C++ 编写的。

我已将问题跟踪到以下函数:

// Note: Class TMarshalServerClientThread has the following objects defined
// CRITICAL_SECTION FCriticalSection;
// std::vector<TMarshalTagInfo*> FTagChangeQueue;

void __fastcall TMarshalServerClientThread::SendChangeNotifications()
{
EnterCriticalSection(FCriticalSection);

try {
if (FTagChangeQueue.size() == 0) {
return;
}

// Process items in change queue

FTagChangeQueue.clear();

} __finally {
LeaveCriticalSection(FCriticalSection);
}
}

此函数在工作线程(从 TThread 派生)的上下文中调用。一个不同的线程在数据可用时用数据填充更改队列。更改队列受临界区对象保护。

当代码运行时,我在试图离开关键部分时偶尔会遇到访问冲突。据我所知,有时当输入 __finally 部分时,堆栈已损坏。堆上的类实例没有问题,但指向该类的指针(例如“this”指针)似乎无效。

如果更改队列为空时删除返回调用,问题就会消失。此外,处理队列中项目的代码不是问题的根源,因为我可以将其注释掉,问题仍然存在。

所以我的问题是在 C++Builder 5 中使用 __finally 时是否存在已知问题?从 try __finally block 中调用 return 是错误的吗?如果是,为什么?

请注意,我意识到有不同/更好的方法来做我正在做的事情,因此我正在重构。但是,我不明白为什么这些代码会导致堆栈损坏。

最佳答案

正如@duDE 指出的那样,您应该使用一对__try、__finally 而不是混合使用C++ try 和Borland 扩展__终于

关于c++ - try __finally block 中可能的堆栈损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17366760/

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