C ++自定义向量实现 - 指向不完整类型的指针的下标

时间:2014-04-11 22:15:50

标签: c++ templates compiler-errors containers compiler-warnings

作为针对练习深/浅拷贝概念的家庭作业的一部分,我尝试实现非常基本的模板化矢量类(以及简单的字符串),以便进一步编码。

我将数据实现为指针数组,但是我的析构函数遇到了以下警告:删除指向不完整类型的指针' <插入类型实例化的类> & #39;可能导致未定义的行为

还有错误使用复制构造函数指向不完整类型&#39; myString []&#39; 的下标(我相信这是与析构函数相同的问题方法的结果)。< / p>

我将析构函数写成简单的delete [] m_data,希望这是确保调用存储的对象的各个析构函数的正确方法。

因此我想问一下

  1. 是否有更适当的方式,
  2. 对于失败的复制构造函数,我对这个类的处理方式是否存在根本上的缺陷。
  3. template <typename T>
    myVector<T>::myVector ( const myVector<T> & x ) : m_size(x.m_size), m_capacity(x.m_capacity), m_data( allocate(x.m_capacity) ) {
        for ( int i = 0; i < x . m_size; ++ i )
            m_data[i] = x . m_data[i];
    }
    
    template <typename T>
    class myVector {
        static const size_t INIT_CAPACITY = 5;
        static const unsigned GROW_FACTOR = 2;
    
        size_t  m_size;
        size_t  m_capacity;
        T ( * m_data )[];
    
        template <typename U>
        friend std::ostream & operator << ( std::ostream & os, const myVector<U> & );
    
        static T (* allocate( size_t size )) [] {
            return (T (*)[])malloc(sizeof(T) * size );;
        }
    
        static T (* reallocate( T (* data)[], size_t size )) [] {
            return (T (*)[]) realloc( data, sizeof(T) * size );
        }
    
        void print( std::ostream & os ) const;
    
    public:
                       myVector    ();
                       myVector    ( const myVector<T> & );
                      ~myVector    ();
        void           push_back   ( const T & );
        T &            operator[]  ( size_t idx );
        const T &      operator[]  ( size_t idx ) const;
        myVector<T> &  operator=   ( const myVector<T> & );
        T *            begin       ();
        T *            end         ();
        size_t         size        () const;
        void           clear       ();
    };
    

1 个答案:

答案 0 :(得分:4)

  

“我将数据作为指针数组”......

     

“析构函数简单delete [] m_data”......

     

(T (*)[])malloc(sizeof(T) * size );

     

realloc ...

一切都是错误的。

一个,在处理未知的C ++对象时,不能使用realloc。您将获得未定义的行为和实际的内存损坏。

两个,您不能混用mallocdelete(或delete[])。将new[]delete[]newdelete一起使用,mallocfree一起使用(除非您不应使用malloc)。

,你声称要使用一个指针数组,但是你要声明一个指向数组的指针;然后你分配一个T数组,并将它转换为指向数组的指针类型。

我认为现在已经够了。完整地废弃代码并重新开始。正确,严肃的方式如下:

T* data; // that's your artray data
data = new T[size];  // allocation
delete [] data; // destruction

没有任何类型的演员阵容永远。没有data以外的指针。通过手动调用new[]来调整大小,使用赋值运算符在循环中复制旧数据,然后复制delete[]旧数据。有更正确的方式,但它们要复杂得多。首先尝试掌握基础知识。