作为针对练习深/浅拷贝概念的家庭作业的一部分,我尝试实现非常基本的模板化矢量类(以及简单的字符串),以便进一步编码。
我将数据实现为指针数组,但是我的析构函数遇到了以下警告:删除指向不完整类型的指针' <插入类型实例化的类> & #39;可能导致未定义的行为。
还有错误使用复制构造函数指向不完整类型&#39; myString []&#39; 的下标(我相信这是与析构函数相同的问题方法的结果)。< / p>
我将析构函数写成简单的delete [] m_data
,希望这是确保调用存储的对象的各个析构函数的正确方法。
因此我想问一下
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 ();
};
答案 0 :(得分:4)
“我将数据作为指针数组”......
“析构函数简单
delete [] m_data
”......
(T (*)[])malloc(sizeof(T) * size );
realloc
...
一切都是错误的。
一个,在处理未知的C ++对象时,不能使用realloc
。您将获得未定义的行为和实际的内存损坏。
两个,您不能混用malloc
和delete
(或delete[]
)。将new[]
与delete[]
,new
与delete
一起使用,malloc
与free
一起使用(除非您不应使用malloc
)。
三,你声称要使用一个指针数组,但是你要声明一个指向数组的指针;然后你分配一个T数组,并将它转换为指向数组的指针类型。
我认为现在已经够了。完整地废弃代码并重新开始。正确,严肃的方式如下:
T* data; // that's your artray data
data = new T[size]; // allocation
delete [] data; // destruction
没有任何类型的演员阵容永远。没有data
以外的指针。通过手动调用new[]
来调整大小,使用赋值运算符在循环中复制旧数据,然后复制delete[]
旧数据。有更正确的方式,但它们要复杂得多。首先尝试掌握基础知识。