【发布时间】:2020-08-14 05:08:48
【问题描述】:
我在我的 C++ 程序中使用我的复制构造函数和赋值运算符。在单独测试它们中的任何一个时,我都会遇到分段错误(核心转储)。我正在构建一个哈希表,该哈希表是通过一个数组构造的,每个索引中有一对。索引是基于散列函数选择的,对的第一部分是键,对的第二部分是值。课程显然还有更多内容,但不会影响复制和赋值运算符,因此我将它们保留在那里。我没有内存泄漏,我测试了 op= 和复制构造函数,其中已经有很多值。
在 UnorderedMap.h 中
template <typename K, typename V>
class MyUnorderedMap: public Dictionary<K, V>
{
private:
MyPair<K, V> *m_data = nullptr; // hash table, array of pairs
int data_size = 0; // current number of elements inside the array
int reserved_size = 0; // max elements inside the array
public:
// Start data_size and reserved_size at 0, m_data to nullptr
MyUnorderedMap();
~MyUnorderedMap();
MyUnorderedMap(const MyUnorderedMap<K, V> &source);
MyUnorderedMap<K, V> & operator=(const MyUnorderedMap<K, V> &source);
}
在 UnorderedMap.hpp 中
// Copy Constructor
template <typename K, typename V>
MyUnorderedMap<K, V>::MyUnorderedMap(const MyUnorderedMap<K, V> &source)
{
data_size = source.data_size;
reserved_size = source.reserved_size;
m_data = new MyPair<K, V>[reserved_size];
for(int i = 0; i < reserved_size; i++)
{
m_data[i].first = source.m_data[i].first;
m_data[i].second = source.m_data[i].second;
}
}
// Assignment Operator
template <typename K, typename V>
MyUnorderedMap<K, V> & MyUnorderedMap<K, V>::operator=(const MyUnorderedMap<K, V> &source)
{
if(this!=&source)
{
delete[] m_data;
reserved_size = source.reserved_size;
data_size = source.data_size;
m_data = new MyPair<K, V>[reserved_size];
for(int i=0; i<reserved_size; i++)
{
m_data[i].first = source.m_data[i].first;
m_data[i].second = source.m_data[i].second;
}
}
return *this;
}
在 MyPair.h 中
template <typename K, typename V>
struct MyPair
{
K first;
V second;
MyPair(){}
MyPair(const K &key): first(key) {}
MyPair(const K &key, const V &value): first(key), second(value) {}
};
有没有人认为它为什么会这样表现有问题? 我对我的复制构造函数比 operator= 更有信心。
Edit x3: 我有一个未显示的插入函数可以正确插入哈希表。所以我解决了复制构造函数,但 op= 仍然不起作用。我修复了上面的复制构造函数,所以现在它显示了一个工作复制构造函数,供任何想要将它用作有效工作基础的人使用。还修复了赋值运算符并提供了正确的版本。
【问题讨论】:
-
什么是
Dictionary? -
你永远不会在任何一个函数中为
m_data赋值。 -
@Beta 它只是一个带有虚函数的模板类 - 它实际上没有任何代码,只是一个要编写的函数模板
标签: c++ arrays hashtable copy-constructor assignment-operator