代码出错部分
Myarray::Myarray(const Myarray& p)
{
cout << "拷贝" << endl;
this->mSize = p.mSize;
this->mCapacity = p.mCapacity;
this->array = new int[p.mCapacity];
//new 分配出来的空间过少!!!!
//导致后续程序运行崩溃
for (int i = 0;i < p.mSize; ++i)
{
this->array[i] = p.array[i];
}
}
Myarray::~Myarray()
{
if (array != NULL)
{
std::cout << "析构调用 " << std::endl;
delete[] this->array;
this->array = NULL;
}
}
查阅资料后的总结:
问题:
1. 内存越界:(自己出现的问题)new的空间太少,使用时超出范围,更改了不属于程序自己的地址上的值。
2. 浅拷贝问题,重复删除同一地址
int* p1 = new int(50);
int* p2 = p1; //p2和p1 现在指向同一内存地址
cout << *p1 << endl;
cout << *p2 << endl;
delete p1; //OK
delete p2; //错,p2所指的内存,已通过delete p1而被释放,不可再delete一次
3. 删除了由系统释放的内存
int* a = new int[10];
int b[50];
a= b;
delete [] a;
此问本意是 delete new int[10]得到的内存空间,但此时 a 指向了 b ;而b[50] 在栈上分配空间。就导致了两个结果:1.原空间未被释放。2.强行释放该有系统释放的 b[50].
4. 首组地址更改:删除动态分配的指针的时,没有指向最初的地址
int *a = new int[10];
*a= 1;
*a++ = 2;
delete[] a;//错误
此时 ++ 改变了指针指向的地址;释放之前应该确保指针指向原位置。第一个元素没有被释放,而在最后多删除了一个元素
- 作用域不同,delete了不同作用于下的。
注意!!
在delete指针后,将指针置为NULL。例如:
delete p;
p = NULL;