delete 出错!!!

1,156 阅读1分钟

代码出错部分

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;//错误

此时 ++ 改变了指针指向的地址;释放之前应该确保指针指向原位置。第一个元素没有被释放,而在最后多删除了一个元素

  1. 作用域不同,delete了不同作用于下的。

注意!!

在delete指针后,将指针置为NULL。例如:

delete p;
p = NULL;