C++ HashTable移除堆分配代码触发读取访问违例原因咨询
哈希表初始化的内存访问问题
问题描述
我正在用C++实现一个HashTable,以人名作为键存储其喜爱的饮品,HashTable的定义及构造函数代码如下:
class HashTable { private: static const int m_tableSize = 10; struct item { std::string name; std::string drink; item* next; }; item* Table[m_tableSize]; };
HashTable::HashTable() { for (int i = 0; i < m_tableSize; i++) { Table[i] = new item; Table[i]->name = "empty"; Table[i]->drink = "empty"; Table[i]->next = NULL; } }
当前代码可正常运行,但存在疑问:Table[i] = new item;是在堆上分配每个桶的首个item,若移除该行(即希望首个item在栈上分配),会触发读取访问违例,想了解原因。我并非一定要在栈上分配,只是不解该编译行为。
原因分析
Table是由item*指针组成的数组,作为类的成员变量,在构造函数执行前,这些指针会被默认初始化为野指针(指向随机内存地址)。- 移除
Table[i] = new item;后,直接通过Table[i]->name这类语句解引用野指针,本质是试图访问随机内存地址中的内容——这属于C++中的未定义行为,触发读取访问违例是完全符合预期的结果。 - 你可能误以为移除该行后
Table[i]会自动指向栈上的对象,但实际上栈对象需要显式创建;即便在构造函数里声明栈上的item变量,构造函数执行完毕后这些栈变量会被销毁,后续访问Table[i]同样会引发内存问题。
内容的提问来源于stack exchange,提问作者AcKoucher
相关产品推荐
相关产品推荐

