Lỗi memcpy.asm Unhandler string

Code : http://pastebin.com/7UxQWPqg

/////////////////////////// Input.cpp ////////////////////////////////
 
// _numberList là biến cho số khách hàng có trong danh sách sổ quản lý
 
void Load(char* filename, KhachHang* & List, int& _numberList)
{
        fstream file;
        file.open(filename, ios::in | ios::binary);
 
        // Dòng đầu tiên của file quy định số khách hàng
        // load số lượng khách hàng có trong danh sách quản lý
 
        file >> _numberList;
        file.ignore(3, '\n');
 
        // Cấp phát bộ nhớ
        List = (KhachHang*)malloc(_numberList * sizeof(KhachHang));
 
        // Load thành viên
 
                // thông tin thành viên được quy định bằng một dòng với cú pháp MaSo-Ten-CMND-NgayGui-SoTien-KyHan
                // phù hợp với định dạng
        for (int i = 0; i < _numberList; i++)
        {
                string getString;
                getline(file, getString, '\n');
 
                stringstream ss(getString);
 
                string temp;
 
                getline(ss, temp, '-');
                List[i].MaSo = stoll(temp, nullptr); // default decimal
 
                getline(ss, temp, '-');
                List[i].Ten = temp;
 
                getline(ss, temp, '-');
                List[i].CMND = stoll(temp, nullptr);
 
                getline(ss, temp, '-');
                List[i].NgayGui = temp;
 
                getline(ss, temp, '-');
                List[i].Sotien = stoll(temp, nullptr);
 
                getline(ss, temp, '-');
                List[i].KyHan = stoi(temp);
        }
 
        file.close();
}
 
//////////////////////// Config.h ////////////////////////
typedef struct KhachHang
{
        long long MaSo;
        string Ten;
        long long CMND;
        string NgayGui;
        long long Sotien;
        int KyHan;
};
 
//////////////////////////// Main.cpp ////////////////////////
 
KhachHang* List;
int _numberList;
 
int main()
{
        // Load data
        Load("data.bin", List, _numberList);
 
        return 0;
}

Sao thay đổi giá trị của string List[i].Ten là xuất hiện lỗi này.
Em search stackoverflow cũng có nhưng chưa có ai trả lời.

Lỗi :


1 Like

Lỗi này có vẻ như truy xuất vùng nhớ sai do thao tác sai trên mảng. Để Đạt xem code thử? Sao không dùng markdown post lên forum ấy :slight_smile:


Điểm lưu ý thứ nhất là List được tạo ra mà không bị hủy đi, sẽ gây leak.

List = (KhachHang*)malloc(_numberList * sizeof(KhachHang));

Tại sao @snt2523 biết là thay đổi Ten gặp lỗi này? Thử comment cái dòng Ten đi xem còn lỗi không?

1 Like

1.Em muốn thiết kế ví dụ như : Đọc từ file danh sách các khách hàng, -> xử lý -> ghi lại xuống file. Vì vậy e tính hủy list khi đã xử lý xong.

2.Em có test thử trước khi vào vòng lặp for đấy.

List[0].Ten = "Test";

thì bị lỗi ngay và khi đặt breakpoint thì tới chỗ đấy thì thông báo memcpy.asm
:frowning:

  1. Các biến khác kiểu long long thì sao chép vào cấu trúc không sao cả. chỉ khi gặp TenNgayGui kiểu string thì thông báo lỗi thôi @ltd
1 Like

Nên hủy trước hoặc sau khi file.close();

Ok, để Đạt xem lại code.


Chỗ sai là chỗ này

List = (KhachHang*)malloc(_numberList * sizeof(KhachHang));

Bởi vì bên trong struct KhachHang mình sử dụng string. Mà string không phải là kiểu dữ liệu cơ bản (tức int, char). Nên việc khởi tạo nó không thể sử dụng malloc vốn dĩ chỉ cấp vùng nhớ. Mà ta phải sử dụng hàm new trong C++.

Đồng thời string cũng là class của C++.

Sửa lại kiểu như thế này là được.

int size = 3;              
list = new KhachHang[size];
1 Like

Tr đất @@

:smiley: cám ơn anh rất nhiều !

Em code bị lẫn lộn giữa C và C++ quá. Cần xem lại kiến thức ngôn ngữ nhé. Anh thấy học vậy không ổn.

Ví dụ như nếu em code C. Em cần ghi typedef struct, nhưng C++ thì chỉ cần struct.

Hoặc nếu em dùng string thì em nên dùng classnew chứ đừng dùng structmalloc.

2 Likes

:smiley: Em đang cố gắng xem lại.
Vì em đang học KTLT nên cũng chưa rõ class.

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