如何知道析构函数中的堆栈损坏来自何处
How to know where comes a stack corruption from in the destructor?
从现在开始,我一直面临一个问题,我没有找到解决方案:(
我有这样的课程:
template<typename Node, unsigned int Threads, unsigned int Size = 2, unsigned int Prefill = 50>
class HazardManager {
public:
HazardManager();
HazardManager(const HazardManager& rhs) = delete;
/* Some methods */
private:
Node* Pointers[Threads][Size];
std::list<Node*> LocalQueues[Threads];
std::list<Node*> FreeQueues[Threads];
/* Some private methods */
};
此类在另一个类中使用:
template<typename T, int Threads>
class AVLTree {
public:
AVLTree();
~AVLTree();
private:
Node* rootHolder;
HazardManager<Node, Threads, 3> hazard;
unsigned int Curren[Threads];
};
并且 AVLTree 类在堆栈上分配。当 AVLTree 被销毁时,我在 std::list 析构函数中遇到了分段错误。这是瓦尔格林德的输出:
==9336== Invalid read of size 8
==9336== at 0x419F69: std::_List_base<avltree::Node*, std::allocator<avltree::Node*> >::_M_clear() (list.tcc:74)
==9336== by 0x419645: std::_List_base<avltree::Node*, std::allocator<avltree::Node*> >::~_List_base() (stl_list.h:401)
==9336== by 0x418DF9: std::list<avltree::Node*, std::allocator<avltree::Node*> >::~list() (stl_list.h:458)
==9336== by 0x418E66: HazardManager<avltree::Node, 1u, 3u, 1u>::~HazardManager() (in /home/wichtounet/dev/btrees/bin/btrees)
==9336== by 0x418F19: avltree::AVLTree<int, 1>::~AVLTree() (AVLTree.hpp:154)
==9336== by 0x418D9A: void testST<avltree::AVLTree<int, 1> >(std::string const&) (test.cpp:110)
==9336== by 0x41831D: test() (test.cpp:180)
==9336== by 0x41CFF8: main (main.cpp:19)
==9336== Address 0x0 is not stack'd, malloc'd or (recently) free'd
在我看来,这是一个堆栈损坏的情况,但我不知道这可以从哪里来......在类本身的使用过程中没有错误,只有当它被销毁时。
是否有工具可以帮助查找此错误或提示,以帮助查找何时可能来自这种损坏?
我正在使用GCC 4.7来编译带有调试符号的应用程序,并且没有优化。
提前感谢您的任何帮助或想法
切换到boost::array
/std::array
并使用at
,你会得到一个out_of_range
例外。
您可能正在过度索引HazardManager::Pointers
从而损坏列表,只有当其析构函数尝试访问无效的内存(因为指针出现乱码)时,您才会意识到这一点。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 变量如何以及在何处可能没有C++关联的名称?
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 如何知道析构函数中的堆栈损坏来自何处