[英]How to add data in an array? What's wrong with this c++ code? [error: subscript of pointer to incomplete type 'void']
[英]C++ custom vector implementation – subscript of pointer to incomplete type
作为针对练习深层/浅层复制概念的家庭作业的一部分,我尝试实现非常基本的模板化矢量类(以及简单字符串),以使进一步编码变得更容易。
我将数据实现为指针数组,但是我的析构函数遇到了以下警告: 删除指向不完整类型' <实例化了实例的类型的指针 > '的 指针 可能会导致未定义的行为 。
还有带有复制构造函数的指向不完整类型“ myString []”的指针的错误下标 (我相信这是与析构函数相同的有问题方法的结果)。
我将析构函数编写为简单的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 ();
};
“我将数据强加为指针数组” ...
“析构函数作为简单的
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[]
旧数据。 有更多适当的方法,但它们却相当复杂。 尝试先掌握基础知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.