无错误():下一个大小无效(快速):0x08912058

Rob*_*yen 1 c++

作为练习的一部分,我正在修改这个代表创建数组的不同方式的类:

template<class T>
class Array 
{
public:

Array(int size, T defaultvalue) : _size(size) 
    {
    _arr = new T[_size] ;
    _def = defaultvalue;
    }


Array(const Array& other) : _size(other._size) 
    {
    _arr = new T[other._size] ;
    // Copy elements
    for (int i=0 ; i<_size ; i++) 
        {
            _arr[i] = other._arr[i] ;
            }
    }

~Array() 
    {
        delete[] _arr ;
    }


Array& operator=(const Array& other) 
    {
    if (&other==this) return *this ;
        if (_size != other._size) 
        {
            resize(other._size) ;
            }
        for (int i=0 ; i<_size ; i++) 
        {
            _arr[i] = other._arr[i] ;
            }
        return *this ;
    }

T& operator[](int index) 
    {           
        if (index>_size)
        {
        int prevsize = _size;
        resize(index);
        for (int i = prevsize+1; i<=index; i++)
            {
            _arr[i] = _def;
            }
        }
        return _arr[index] ;
    }

const T& operator[](int index) const 
    {
        if (index>_size)
        {
        int prevsize = _size;
        resize(index);
        for (int i = prevsize+1; i<=index; i++)
            {
            _arr[i] = _def;
            }
        }
        return _arr[index] ;
    }

int size() const { return _size;}

T defval() const { return _def;}

void resize(int newSize) 
    {
        // Allocate new array
        T* newArr = new T[newSize] ;
    // Copy elements
    for (int i=0 ; i<_size ; i++) 
        {
            newArr[i] = _arr[i] ;
            }
    // Delete old array and install new one
        delete[] _arr ;
        _size = newSize ;
        _arr = newArr ;
    }


private:
int _size ;
T* _arr ;
T _def;
} ;
Run Code Online (Sandbox Code Playgroud)

现在这适用于整数数组,但它给了我

*** 检测到 glibc *** ./a.out: free(): 下一个大小无效(快速):0x08912058 ***

当我这样做时,例如:

const char* one = new char[3];
one = "abc";
Array<const char*> b(2, one);
Run Code Online (Sandbox Code Playgroud)

这应该创建一个长度为 2 的数组,并且每当我访问索引 > 2 的任何元素时,它都应该返回字符串“abc”。当我访问这样的元素时,数组返回它应该返回的内容,但我收到了上述错误。错误之后是回溯。

Omr*_*rel 5

您的 resize 函数将调整为您给定的大小(即index),但随后您将数组设置为(并包括)index。这是一个无效的索引 - 您的数组从0index-1

我说的是这些行:

resize(index);
for (int i = prevsize+1; i<=index; i++)
Run Code Online (Sandbox Code Playgroud)

所以,你需要调用resizeindex+1来解决这个问题。

还:

const char* one = new char[3];
one = "abc";
Run Code Online (Sandbox Code Playgroud)

这只是泄漏内存(您分配一个新缓冲区,然后立即设置one"abc"不同的指针)。