30/09/2018, 16:07

Giúp mình fix lỗi Debug Assertion Failed

m.n giúp mình sửa lỗi này vs! mất cả ngày lang thang trên mạng mà vẫn ko biết lỗi tại sao!
mình viết một đoạn code C++ để xây dựng một class vector với đầy đủ tính năng như thêm , cộng trừ nhân gán… đây là code của mình:

>      #include<iostream>
>     using namespace std;
>     class vector
>     {
>     private:
>     	double *data; // toa do
>     	int nelem; //so chieu cua khong gian vector
>     public:
>     	vector() : nelem(0), data(NULL) {}; // ham tao khong doi
>     	vector(int );
>     	~vector()
>     	{
>     		if (data != NULL){
>     			delete []data; data = NULL;
>     		}
>     	}
>     	int size(){ return nelem; }
>     	double getElem(int i){ return data[i]; }
>     	void putElem(int i, double d){ data[i] = d; }
>     	vector operator+(vector u)
>     	{
>     		int n;
>     		n = (nelem > u.nelem) ? nelem : u.nelem;       // nelem dc tro boi con tro this
>     		cout << "
 
 
 : gia tri cua n: " << n << endl;
>     		vector v(n);
>     		if (nelem > u.nelem)
>     			for (int i = 0; i < n; i++)
>     			if (i <u.nelem) v.data[i] = data[i] + u.data[i];
>     			else v.data[i] = data[i];
>     		else
>     		{
>     			for (int i = 0; i < n; i++)
>     			if (i <nelem) v.data[i] = data[i] + u.data[i];
>     			else v.data[i] = u.data[i];
>     		}
>     		for (int i = 0; i < nelem; i++) cout << " | " <<v.data[i];
>     		cout << "
 oat" << endl;
>     		return v;
>     	}
>     	int operator*(vector);  // tich vo huong
>     	const vector& operator=(const vector&);
>     	friend ostream& operator<<(ostream& , vector& );
>     	void in()
>     	{
>     		for (int i = 0; i < nelem; i++) cout << " | " << data[i];
>     	}
>     };
>     ostream& operator<<(ostream& os, vector& d)
>     {
>     	for (int i = 0; i < d.nelem; i++)
>     		os <<" "<<d.data[i];
>     	return os;
>     }
>     vector::vector(int n)
>     {
>     	nelem = n; data = new double[n];
>     	for (int i = 0; i < n; i++)
>     	data[i] = 0;
>     }
>     const vector& vector::operator=(const vector &d) //tra ve tham chieu den doi tuong duoc gan! dieu nay giup gan lien tiep a=b=c...
>     { 
>     	if (this->nelem != d.nelem){
>     		delete[](this->data); this->data = NULL;
>     		this->nelem = d.nelem;
>     		this->data = new double[this->nelem]; 
>     	}
>     	for (int i = 0; i <this->nelem; i++) {
>     		(this->data)[i] = d.data[i];
>     		cout << " | " << data[i];
>     	}
>     	cout << "
 check for update " <<data[nelem] << endl;

>     	return d;
>     }
>     int vector::operator*(vector u)
>     {
>     	int n,t=0;
>     	n = (nelem>u.nelem) ? nelem : u.nelem;
>     	vector v(n);
>     	if (nelem > u.nelem)
>     	for (int i = 0; i < u.nelem; i++) t = t + u.nelem*nelem;
>     	else for (int i = 0; i < nelem; i++) t = t + u.nelem*nelem;
>     	return t;
>     }
>     void main()
>     {
>     	vector v(5), u(6), q(6);
>     	v.putElem(4, 1);
>     	u.in();
>     	cout << "
 truoc khi cong u= " << u << " | v= " << v << endl; 
>     	u.in();
>     	cout << " 
 what the hell 
";
>     	u= v; cout << "
 clgt 
";  u.in();
>     	cout << " 
 hihi "<<endl;
>     	v.in();
>     	cout << "
 cho nay van on 
";
>     	q = u + v;
>     	cout << "
 sau khi cong: " << q << endl;
>     	system("pause");
>     }

khi mình debug code trên bằng visua studio C++ 2013 express thì nó báo lỗi như sau


lúc đầu mình nghĩ đây là một lỗi tràn mảng động hoặc do truy cập con trỏ động sai địa chỉ! nhưng mà đã dò đi dò lại code rồi vẫn ko thấy lỗi! khi chuyển qua dev thì lại chạy ổn ra kết quả đúng sau dòng oat ko phải kết quả như trên hình ! lên google thì thấy lỗi này còn có ở cả mấy phần mềm ko phải là trình biên dịch!

có khi nào đây là lỗi do cái phần mềm visua studio của mình ko??? hay lỗi library .lib của phần mềm???
ai biết giúp mình vs nhé!
// mấy cái dòng xuất "cout<< " linh tinh là để kiểm tra chỉ số chạy
còn nữa! cách trình bầy code còn lủng củng nên ai có ý kiến nào hay thì góp ý mình còn sửa nhóe
thanks you so much!!!

Phạm Hoàng Tuấn viết 18:16 ngày 30/09/2018

E đổi trong hàm hủy thành vậy thử xem sao:

~vector()
	{
		if (data != NULL)
		{
			data = NULL;
			delete [] data;
			
		}
	}
chazo1994 viết 18:09 ngày 30/09/2018

cái đó sao đc a! e nghĩ khi gán data=NULL thì nó có chỉ đến mảng động nữa đâu -> ko thể delete đc chứ !!!

Hoàng Lê viết 18:16 ngày 30/09/2018

bạn ơi, mình chưa đọc code nhưng mình nghĩ bạn đã delete con trỏ đến 2 lần nên nó báo lỗi đó
Thân và quyết thắng v:

Bài liên quan
0