Xóa con trỏ trong class bị lỗi

Em có bài code như dưới:

#include<iostream>
class Vector {
private:
	int N;
	int* P;
public:
	Vector(){
		P = new int[N];
	}
	Vector(int n) {
		N = n;
		P = new int[n];
	}
	friend std::istream& operator>>(std::istream& nhap, Vector& v) {
		std::cout << "\n Nhap so phan tu: ";
		nhap >> v.N;
		v.P = new int[v.N];
		for (int i = 0; i < v.N; i++) {
			std::cout << " Vec[" << i + 1 << "]= ";
			nhap >> *(v.P + i);
		}
		return nhap;
	}
	friend std::ostream& operator<<(std::ostream& xuat, const Vector v) {
		xuat << "\n So luong phan tu: " << v.N;
		for (int i = 0; i < v.N; i++) {
			xuat << "\n " << *(v.P + i);
		}
		return xuat;
	}
	Vector operator=(Vector v) {
		N = v.N;
		for (int i = 0; i < N; i++) {
			*(P + i) == *(v.P + i);
		}
		return *this;
	}
	Vector operator+(Vector v) {
		int temp;
		if (N > v.N)
			temp = N;
		else temp = v.N;
		for (int i = 0; i < temp; i++) {
			if (i > v.N)
				*(P + i) = *(P + i);
			*(P + i) += *(v.P + i);
		}
	}
	~Vector() {
		delete[] P;
	}
};
int main() {
	Vector vt1, vt2;
	std::cin >> vt1 >> vt2;
	std::cout << vt1 << vt2;
	system("pause");
	return 0;
}

Khi xóa lệnh delete[] p thì nó chạy bình thường nhưng thêm lệnh đó vào thì nó chạy xong báo lỗi. Ai biết sửa lỗi này chỉ giúp em.

Do chỗ Vector() đấy :smiley: N đã có giá trị đâu.

1 Like

Ủa, nhưng mà trong cin >> thấy có đoạn v.P = new int[v.N];

1 Like

Em thử truyền giá trị cho N luôn rồi nhưng nó vẫn báo lỗi.

Em tìm thấy cách gỡ lỗi rồi. Thêm đoạn code:

Vector(Vector& v) {
		N = v.N;
		P = new int[N];
		for (int i = 0; i < N; i++)
			P[i] = v.P[i];
	}

là được. Nhưng vẫn chưa hiểu tại sao phải dùng hàm này thì mới hết lỗi. @@

Vì nó dùng copy constructor ở chỗ này :smiley: thêm & vào nhé.

Để bt là nó bưng nguyên con thành ra dùng mảng đã delete (tạch) và delete hai lần :smiley:

1 Like

Sửa thành

friend std::ostream& operator<<(std::ostream& xuat, const Vector& v)

phải không anh?

Anh giải thích chi tiết hơn tí được không ạ? Em sửa lại đoạn code thì đúng nhưng vẫn chưa hiểu lắm.

Truyền tham trị tức là truyền một bản sao (copy) vào hàm, lúc này phải dùng copy constructor, với cài đặt mặc định thì chỉ là copy ngang (shallow copy) thôi. Khi rời hàm operator+, copy này bị hủy bỏ tức là gọi hàm hủy => delete[]. Từ đây về sau thì thao tác lên đó đều là bất hợp lệ.

Truyền tham trị đối tượng chủ yếu là để dùng trick gì đó chứ thường dùng const T&.

Bạn sửa tương tự cho những hàm còn lại :smiley:

4 Likes

Cám ơn anh nhé. Mặc dù vẫn chưa hiểu lắm nhưng cũng thông não được phần nào. Chắc phải tìm coi lại hàm hủy và đồng bọn.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?