Lỗi khi giải phóng ô nhớ con trỏ

Chào mọi người, hôm này em có làm 1 hàm chuyển 1 cấu trúc số (ví dụ 2 3 ) ở tệp này sẽ thành (2/3) ở tệp kia. Code của em như vậy.

void Read_sort_wirte(istream& inDev, ostream& outDev)//Hàm BAI3
{
	int n = 0;

	//=========================READ=====================

	PhanSo trash;
	PhanSo* pArr = nullptr;
	while (inDev >> trash)// Dùng để nhập dữ liệu phân số từ thiết bị nhập một cách tùy chọn
	{
		if (inDev.fail()){
			delete[] pArr;
			pArr = nullptr;
			break;
		}
		Chen_mang_phan_so(pArr, n, trash);
	}

	//=========================SORT=====================

	////==================LAP MANG SO THUC==============

	float* fArr = nullptr;
	float* fArr_new = (float*)realloc(fArr, n + 1 * sizeof(float));//Lập một mảng số thực nhằm tính giá trị gần đúng của từng phân số của mảng phân số
	if (fArr_new != nullptr)
	{
		for (int i = 0; i < n; i++)
		{
			fArr_new[i] = (float)pArr[i].tu / pArr[i].mau;
		}
		fArr = fArr_new;
	}
	////==================SORT=========================
	for (int i = 0; i < n - 1; i++)
	{
		for (int y = i + 1; y < n; y++)
		{
			if (fArr[i] >fArr[y])
			{
				float temp = fArr[i];//Em không dùng hoán vị phương thức template <class T> cho hàm được ạ, nó bị lỗi , như nó bảo phải dùng trong main hay sao ấy thầy, thấy chỉ em với.
				fArr[i] = fArr[y];
				fArr[y] = temp;
				PhanSo tempp = pArr[i];
				pArr[i] = pArr[y];
				pArr[y] = tempp;
			}
		}
	}

	//==================WRITE=====================

	for (int i = 0; i < n; i++)
	{
		outDev << pArr[i];
	}

	delete[] pArr;
	//delete[] fArr;
}

Và khi em xóa ô nhớ của fArr thì em mắc debug và k thể hiểu tại sao, mọ người giúp em với ạ.

Các hàm họ alloc (malloc, calloc, realloc là bên C) thì đi chung với free (cũng bên C)

Còn bên C++, thì dùng new/new [] và delete/delete []

Ở đây bạn đem râu ông nọ cắm cằm bà kia như vậy thì fail là đúng rồi bạn.

3 Likes

dạ cái đó em lỗi, nhưng mà đổi qua free thì nó vẫn báo debug nơi free(fArr); anh ơi

Như nó xem fArr là mảng tĩnh hay sao ấy anh

Thắc mắc tí:

  • n + 1 * sizeof(float)(n + 1) * sizeof(float) khác nhau như thế nào nhỉ? :thinking:
  • Nếu trong điều kiện if không chạy thì điều gì xảy ra ở những đoạn mã phía sau?

Bạn có 1 lớp (hay cấu trúc) với tên gọi là PhanSo. Để tiện cho việc sắp xếp thì trong lớp đó, khai báo thêm trường kiểu số thực (float hoặc double) để tính ngay và luôn giá trị của phân số. Lúc này, bạn có thể gọi đến std::sort() mà không cần tự viết nữa.

2 Likes

Ồ, em cảm ơn rất nhiều từ góp ý của anh ạ.

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