30/09/2018, 16:51

[C++] 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, '
');
 
        // 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, '
');
 
                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 :


Nguyễn Minh Dũng viết 18:59 ngày 30/09/2018

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

Làm sao để có thể hiển thị syntax highlighting bằng markdown? Các bạn phải đánh dấu ``` như ví dụ dưới đây Chú ý, dấu ``` được tạo ra bởi nút nằm bên trái số 1 trên bàn phím, nút này sẽ là ~ khi bấm giữ Shift Ví dụ cho C Nội dung: ``` void main() { } ``` Và đừng quên ``` ở cuối Kết quả void main() { } Ví dụ cho Pascal Nội dung: ``` Program HelloWorld; Begin WriteLn('Hello world!') {no ";" is required after the last statement of a block - adding one adds a "null stateme…

Đ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));

Sao thay đổi giá trị của string List[i].Ten là xuất hiện lỗi này.

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?

Evil viết 19:00 ngày 30/09/2018

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

  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
Nguyễn Minh Dũng viết 19:06 ngày 30/09/2018

Vì vậy e tính hủy list khi đã xử lý xong.

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

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

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];
Evil viết 18:55 ngày 30/09/2018

Tr đất @@

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

Nguyễn Minh Dũng viết 18:57 ngày 30/09/2018

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.

Evil viết 18:52 ngày 30/09/2018

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

Bài liên quan
0