繁体   English   中英

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

[英]C++ custom vector implementation – subscript of pointer to incomplete type

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

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

还有带有复制构造函数的指向不完整类型“ myString []”的指针的错误下 (我相信这是与析构函数相同的有问题方法的结果)。

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

因此我想问

  1. 是否有更合适的方法可以做到这一点,
  2. 关于失败的复制构造函数,我对此类的方法是否从根本上存在缺陷。
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       ();
};

“我将数据强加为指针数组” ...

“析构函数作为简单的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[]旧数据。 更多适当的方法,但它们却相当复杂。 尝试先掌握基础知识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM