c++ delete有些什么错误?

#include <iostream>
using namespace std;
class number
{
public:
    number(int len)
    {
        length = len;
    }
    void put()
    {
        for (int i = 0; i < length; i++)
            cin >> p[i];
    }
    void show()
    {
        for (int i = 0; i < length; i++)
            cout << p[i];
    }
    ~number()
    { 
        delete[] p;//程序运行到在这里就会崩溃//
        cout << "delect";
    }
private:
    int* p=new int [length];
    int length;

};
int main()
{
    number a(5);
    a.put();
    a.show();
    return 0;
}

到底发生了什么


 

class number
{
public:
	number(int len)
	{
		length = len;
		p = new int[length];
	}
	void put()
	{
		for (int i = 0; i < length; i++)
			cin >> p[i];
	}
	void show()
	{
		for (int i = 0; i < length; i++)
			cout << p[i];
	}
	~number()
	{
		delete[] p;//程序运行到在这里就会崩溃//
		cout << "delect";
	}
private:
	int* p;
	int length;

};

 

为什么我复制过来运行没有任何问题

 

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

这种错误,无非是两种情况

1.对内存的操作越界了,超出所分配的内存的边界

2.DELETE后没有设NULL, 野指针

1)你也可以再试试把p的空间开辟得更大,例如+1或者更多,进行尝试。

2)其实没必要纠结为什么放在构造里就不会错,对于指针成员,就不要用这种新特性,容易出错,你也不清楚他的执行过程,不熟悉c++11新特性,在指针成员定义时就开辟空间,你不能确定你new这句话是否生效了,因为构造函数是会覆盖你的定义初始化的,也许此时你的指针p就是一个野指针也说不定。

再补充一下,在用这些类生成对象数组的时候,最好用delete[]。而用delete来释放也许不会出问题,也许后果很严重。delete完成以后,应将指针置为NULL,不然很容易出现野指针析构失败。代码量大了的时候,你就会发现这样做是很有必要的。

if(p != NULL)
{
    delete p;
    p = NULL;
}

 

把 int* p=new int [length];指针分配放到构造函数里吧

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html