阵列包装器损坏堆

问题描述 投票:0回答:1

后续:array wrapper corrupts stack

该项目:

我正在研究std::vector替代品。

错误:

每当尝试删除要创建的临时数组以存储我删除的另一个数组的复制元素,以便在调整数组大小时重新分配它的复制元素时,都会收到堆损坏错误。 (看来,如果我尝试将一个数组分配给另一个数组,实际上我最终将指向该数组的指针分配给了另一个数组,而不是复制元素。这确实是疯狂的东西。)>

我在线阅读该错误实际上可能来自与数组实际交互的部分,但是该错误仅在我尝试删除它时弹出。

与数组交互的地方是函数_tempcpy。我将指针传递给源数组和目标数组,然后将每个元素从源数组复制到目标数组。为了确保数组从0开始而不是从1开始,我有些挣扎,在此过程中,我对element_count成员的看法太混乱了,所以可能是我以某种方式超出了范围,并且我一直在盯着太多的代码我看不到问题。

代码:

template<class T> class dyn_arr
{
public:

    dyn_arr(void)
    {
        this->array         = {};
        this->element_count = {};
    }

    ~dyn_arr(void)
    {
        this->dealloc();
    }

    bool alloc(unsigned int element_count)
    {
        if (0 == element_count)
        {
            element_count = 1;
        }

        if (this->array != nullptr)
        {
            T* temp = new T[this->element_count];

            if (false == this->_tempcpy(&this->array, &temp, this->element_count))
            {
                return false;
            }

            delete[] this->array;
            this->array = new T[this->element_count];

            if (false == this->_tempcpy(&temp, &this->array, this->element_count))
            {
                return false;
            }

            delete[] temp;

            if (nullptr != this->array)
            {
                return true;
            }
        }
        else
        {
            this->array = new T[this->element_count];

            if (nullptr != this->array)
            {
                return true;
            }
        }

        return false;
    }

    bool dealloc(void)
    {
        if (nullptr == this->array)
        {
            return false;
        }

        delete[] this->array;

        return true;
    }

    bool add(T Object)
    {
        if (0 == Object)
        {
            return false;
        }

        if (true == this->alloc(this->element_count))
        {
            this->array[this->element_count] = Object;

            ++this->element_count;

            return true;
        }

        return false;
    }

    T get(unsigned int index)
    {
        if (index > this->element_count)
        {
            return T{};
        }

        return this->array[index];
    }

    unsigned int get_count(void)
    {
        return this->element_count;
    }

private:

    bool _tempcpy(T** src, T** dest, unsigned int count)
    {
        if ((nullptr == src) || (nullptr == dest) || (0 == count))
        {
            return false;
        }

        for (unsigned int i = 0; i < count; ++i)
        {
            *dest[i] = *src[i];
        }

        return true;
    }

    T* array;
    unsigned int element_count;
};

int main()
{
    dyn_arr<int> pNr = {};
    pNr.add(1);
    pNr.add(2);
    pNr.add(3);

    for (int i = 0; i < pNr.get_count(); ++i)
    {
        printf("%d\n", pNr.get(i));
    }

    getchar();
    return 0;
}
    

后续:数组包装器损坏堆栈项目:我正在进行std :: vector替换。错误:每当我尝试删除临时数组时,我都会得到堆损坏错误...

c++ arrays heap dynamic-arrays heap-corruption
1个回答
0
投票

alloc函数中存在一些问题,例如:

© www.soinside.com 2019 - 2024. All rights reserved.