01/10/2018, 08:23
Giải phóng mảng 2 chiều cấp phát động ntn đã đúng chưa?
void FreeMatrix(int **a)
{
if (a != NULL)
{
for (int i = 0; i <row; ++i)
delete[] a[i];
}
delete[]a;
}
ở đây biến row chưa đc khai báo thì phải làm s?
Bài liên quan
delete a[i]
thôi.chưa có thì bạn cấp phát cho a như nào?
Lưu mảng là đã phải có số phần tử rồi @thớt không có nó không làm ăn gì được.
Làm thế lỗi đấy bạn.
a[i]
là một vùng nhớ (new T[1]
) chứ không phải chỉ là 1 biến (new T
)Int **a;
a=new int *[row];
For (i=0;i <row;i++)
a [i]= new int [column];
Ý mk là trong hàm Free k có khai báo row
Ơ cấp phát động mà. Số row đc nhập từ bàn phím. Nhưng trong hàm Free lại k khai báo
Khó thế thì bạn đóng gói lại cả con trỏ và số dòng cột vào struct nhé.
Chẳng hiểu sao trong hàm đó của bạn tự nhiên có row, đấy là biến toàn cục chăng?
Hi amaterasu.
1 Việc giải phóng đúng hay sai bạn hoàn toàn tự kiểm tra được.
Nếu bạn dùng Linux thì có một công cụ Valgrind để kiểm tra lỗi này.(TIếc là không có tài liệu tiếng Việt).
2 Mình muốn góp ý về cách cài đặt cấu trúc dữ liệu của bạn. Việc cấp phát động như này là không cần thiết vì ma trận có kích thước các dòng là như nhau. Bạn có thể dùng mảng một chiều và sau đó ánh xạ thành mảng hai chiều sẽ đơn giản hơn, Hoặc dùng con trỏ mảng hai chiều.
Thầy mk dạy cho câu lệnh giải phóng nv mà @@~
Chắc thầy quên dặn phải khai báo biến và bảo lưu giá trị
Tại thầy giao bài tập làm theo 2 hướng dùng con trỏ và con trỏ trỏ trỏ con trỏ phải làm thôi. Chứ dùng cách này lm gì cho rối
Mk nghĩ đặt hết trong main thì n vẫn chạy bt. Nhưng tạo thành 2 hàm riêng ntn thì tự nhiên chả biết cái row nó từ đâu ra :v
Bạn phải đặt
row
làm tham số chứ =)Vậy thì bạn cứ truyền row của bạn vào rồi dùng thôi
à, quên mất. he he .