C++ c++;堆警告:释放堆块后,它被修改

C++ c++;堆警告:释放堆块后,它被修改,c++,heap,C++,Heap,我有以下类别和代码: template <class T> class HashTable { struct Pair{ T element; int key; Pair(T element, int Key) : element(element), key(key) {}; }; int table_size; int counter; List<Pair> (*elements); void changeTableSize(int new

我有以下类别和代码:

template <class T>
class HashTable {

struct Pair{
    T element;
    int key;
    Pair(T element, int Key) : element(element), key(key) {};
};

int table_size;
int counter;
List<Pair> (*elements);

void changeTableSize(int newSize){
    List<Pair> *temp = new List<Pair>[newSize];
    for (int i = 0; i < table_size; i++){
        for (typename List<Pair>::Iterator j = elements[i].begin(); j != elements[i].end(); j++){
            Pair  p = *j;
            temp[p.key % newSize].insert(Pair(p.element, p.key));
        }
    }
    delete[] elements;
    elements = temp;
    table_size = newSize;
}

public:
    HashTable() : table_size(100), counter(0){
        elements = new List<Pair>[table_size];
    };
void insert(T data, int key){
    if (member(key)){
        throw ElementAlreadyExists();
    }
    elements[key % table_size].insert(Pair (data, key));
    counter++;
    if (counter == table_size){
        changeTableSize(table_size*2);
    }
};
模板
类哈希表{
结构对{
T元素;
int键;
Pair(T元素,int Key):元素(element),Key(Key){};
};
int表的大小;
整数计数器;
清单(*要素);
void changeTableSize(int newSize){
列表*临时=新列表[新闻大小];
对于(int i=0;i

当我第一次调用changeTableSize()时,一切正常。当我第二次调用它时,我的程序崩溃了,并说“警告:堆:释放堆块006618C0,释放后在006618D4修改”在分配临时值之后,什么会导致这种情况?

如果originalSize>table\u size,则在内部“for”循环中执行非法内存访问

删除传递给函数的“originalSize”参数

改为使用类变量“table_size”,并在返回之前将其更新为新的大小

此外,确保类对具有正确定义和实现的副本构造函数:

Pair(const Pair& pair)
{
    // For each variable x of pair, that points to dynamically-allocated memory:
    // this->x = new ...
    // memcpy(this->x,pair.x,...)

    // For each variable y of pair, that doesn't point to dynamically-allocated memory:
    // this->y = pair.y
}

否则,您可能会有两个不同的类对实例,其内部变量指向同一个动态分配的内存。当一个实例被销毁时,另一个实例的内部变量将指向已释放的内存。

如果不初始化它,就不能使用
元素。
en assign temp给它。@LuchianGrigore元素是在这里没有显示的构造函数中初始化的。@StephaneRolland typename很好。@SChepurin那么我应该怎么做,为什么这是一个问题?编辑,注意构造函数。元素确实指向堆为什么我这样做是错误的?我正在为temp分配空间,我删除元素,然后我告诉elem正确,我现在明白了。所以答案又变了。你仍然需要删除~Table()中的元素……你是否也将“Table_size”设置为修订答案中描述的新值?是的。Table_size=newSize