首先是对默认构造函数的应用心得
在使用默认构造函数时,可以给已有的默认构造函数提供默认值,即:
seqlist(int maxsize_ = 10)
此为在类中声明的时候的样式,
但是在类外进行定义时要注意要将初始化的=10删掉;
即初始化时要成为:
seqlist::seqlist(int maxsize_)
{
…
}
其次是debug时出现的已触发一个断点,这个错误在codeblocks中并没有出现,但是在VS中运行时报错 无法编译,应该是因为在函数中生成的seqlist类中含有 T*data[] 而在函数运行完成后需要回收result的空间?所以导致的内存越界?
对内存越界做一个总结:
数组越界(可能是我遇到的问题)
主要包括数组下标取值越界以及指向数组的指针的指向范围越界。
下标取值不做赘述。要在规定的范围内取下标
指针指向范围越界是指p为首地址,不断进行p++使得该数组越界
忽略字符串最后的\0导致的越界.
数组指针以及指针数组
int *a[5]是指针数组,int (*a)[5]是数组指针。
指针数组是指存放指针的数组,a是一个数组,里面的元素都是指针。
数组指针是指向数组地址的指针,其本质为指针。
对内存泄漏问题的一点思考
seqlist<T> seqlist<T>::operator+(const seqlist &a)
{
int i;
seqlist<T> result(a.cursize + cursize);
for (i = 0; i < cursize; i++)
{
result.data[i] = data[i];
}
for (i = cursize; i < cursize + a.cursize; i++)
{
result.data[i] = a.data[i - cursize];
}
result.cursize = result.maxsize = cursize + a.cursize;
return result;//此处在return时在vs之中不可行 初步判断是因为result之中含有指针 在函数结束之后指针被回收导致访问出错。
}
seqlist定义如下
template<class T>
class seqlist
{
private:
T *data;
int cursize;
int maxsize;
void doublespace();
public:
seqlist(int n = 10);
~seqlist();
void clear();
void insert(const T &a, int i);
void deleteT(const int &i);
int research(const T &a)const;
T visit(const int &a)const;
void traverse()const;
int getlength()const;
seqlist operator +(const seqlist &a);
void operator =(const seqlist &a);
};
在函数中声明的变量是该函数私有的。在函数被调用时,计算机将为这些变量分配内存;在函数结束时,计算机将释放这些变量使用的内存即局部变量
原因应该就是result在函数结束时调用一次析构函数使得data数组消失,可以通过拷贝(复制)构造函数来避免这一现象的产生。
同时也理解了函数返回值的规律:
函数返回值为局部变量时(尤其是为类的时候)函数在运行结束之后会将局部变量定义的类通过复制构造函数生成一个匿名的类(我自己是看不到的)同时将局部变量的类(即result直接析构掉),返回值即为这个匿名类。因此,若在类之中存在有指针变量,因为result之中的data已经被delete,因此匿名类之中的data是没有实际意义的,甚至在主函数结束之后还要再被析构一遍,因此就产生了在VS之中的报错,(应该是内存越界)
补救的办法就是定义一个复制构造函数,复制构造函数在复制的时候在匿名类之中重新new一个data数组,从而避免了对同一块空间析构两次的尴尬。
保存析构函数构造函数复制构造函数使用指南:
https://blog.csdn.net/somehow1002/article/details/50206589
类中有指针解决办法仍然做返回值解决办法:
https://zhidao.baidu.com/question/398139472.html
解决代码:定义拷贝构造函数
template<class T>
seqlist<T>::seqlist(const seqlist &a)
{
int i;
data = new T[a.maxsize];
for (i = 0; i < a.cursize; i++)
data[i] = a.data[i];
maxsize = a.maxsize;
cursize = a.cursize;
}
但是在codeblocks中不需要定义拷贝也可流畅运行。。。。