我的动态数组模板类正在做奇怪的事情

Posted

技术标签:

【中文标题】我的动态数组模板类正在做奇怪的事情【英文标题】:My Dynamic Array template class is doing weird things 【发布时间】:2012-05-16 05:49:26 【问题描述】:

The code

我在处理字符串时遇到了问题。每当我尝试一个字符串时,我都会收到一个可爱的小错误代码:

arraytest.exe 中 0x77e815de 处未处理的异常:0xC0000005:
访问冲突读取位置0xabababab。

它可以很好地处理 int、double 和 char。我还尝试了与我使用的完全相同的测试字符串(字母表)作为 char*,它也做得很好。它只是在弦上呕吐,原因我无法理解。我真的不知道下一步该去哪里。有什么建议吗?

【问题讨论】:

欢迎来到 SO,有几点建议:1)在您的问题中发布所有相关代码,不赞成使用指向代码转储的外部链接。 2) 请阅读sscee.org。 【参考方案1】:

push_back 中的重新分配代码有问题

template<class type>
void DynamicArray<type>::push_back(type newValue)

        ++_size;   // <=== **

        if (_size > _capacity) // If size larger than capacity
        
                _capacity *= CAPACITY_MULT; // double capacity
                type* tempArray = new type[_capacity];// Create temporary array with new capacity
                // Copy array values into temporary array

                for (int i = 0; i < _size; i++)    // <=== **
                
                        tempArray[i] = dynArray[i];
                
                // Delete dynArray
                delete[] dynArray;
                // Insert new value at end of temporary array
                // Set dynArray to temporary array
                dynArray = tempArray;
        

        dynArray[_size - 1] = newValue;

你首先增加当前容器的大小之前检查是否有空间容纳新元素。然后在将旧值复制到新数组时使用新大小。

这似乎适用于原始类型,但 std::string 会尝试复制其自己的内部数据(不存在)并可能导致访问冲突。

【讨论】:

以上是关于我的动态数组模板类正在做奇怪的事情的主要内容,如果未能解决你的问题,请参考以下文章

模板化动态数组中的运算符重载 []

动态大小的多维数组的 C++ 解决方法

c++ 向量比我的动态数组慢?

尝试使用动态内存分配创建节点指针数组

使用奇怪的重复模板模式 (CRTP) 在抽象基类中实现赋值运算符

如何在具有动态大小数组的模板类中重载 operator=