C++Segfault追加、push_back和运算符=或+=

C++ Segfault appending, push_back and operator = or +=

本文关键字:运算符 back 追加 push C++Segfault      更新时间:2023-10-16

我有一个非常简单的代码可以从文件中读取,并将字符附加到字符串中,并生成结构的数组。我用init方法初始化字符串,并使用push_back(char)附加到字符串,但initialization和push_back都给了我segfault。我想这可能是编译器的问题,所以我下载了一个新安装的cygwin仍然没有工作。我尝试了MinGW,在MinGW中我仍然遇到了一个错误,但我看不到它,因为在调试时什么都不起作用,在控制台中printf没有显示,cin也不起作用。所以我无法继续初始化,只能在运行代码时看到错误。最后,我尝试了Visual Studio,但它甚至没有编译我的代码,因为我没有恒定的数组大小。

typedef struct Employee_S {
    string ID, name, surname;
    int age;
    double salary;
} *Employee, Employee_t[1];
Employee employee_init() {
    Employee employee = (Employee) malloc(sizeof (Employee_t));
    if (employee == NULL) {
        printf("Error @ linked_arraylist_init: Cannot allocate memory. (Initialize Error)n");
    } else {
        (employee->ID) = "";
        (employee->name) = "";
        (employee->surname) = "";
    }
    return employee;
}

我尝试过用+=、append、=、push_back进行初始化,所有这些都给出了segfault

这是它创建的堆栈转储

Exception: STATUS_ACCESS_VIOLATION at rip=0057B1CAF9F
rax=3FFFFFFFFFFFFFF9 rbx=0000000600062BF0 rcx=0000000000000000
rdx=000000010040407A rsi=0000000000000000 rdi=000000000023A3E0
r8 =0000000000000000 r9 =000000010040407A r10=0000000000240000
r11=00000001004010E2 r12=0000000000000001 r13=0000000000000000
r14=0000000000000001 r15=0000000000000000
rbp=000000000023A340 rsp=000000000023A2C0
program=D:Programming StuffasddistDebugCygwin_4.x-Windowsasd.exe, pid 3320, thread main
cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame        Function    Args
0000023A340  0057B1CAF9F (00000000000, 0000023AB2F, 10000000023A39E, 0000023AAD0)
0000023A340  0010040110E (0057B1C65FE, 00000000000, 00000000000, 0000023A8E0)
0000023A3D0  00100401783 (0000023A3F0, 0000023A800, 00100000020, 0000023A9FB)
0000023A460  0010040224E (00000000020, FF0700010302FF00, 0018004819A, 00000000000)
0000023AB90  0018004820B (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  0018004611B (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00180046274 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  001004027A1 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  00100401010 (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  7FFECA3416AD (00000000000, 00000000000, 00000000000, 00000000000)
00000000000  7FFECC494629 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace

如果我能在这件事上得到一些帮助,我会很高兴的。

C malloc只为employee分配内存,它不构造对象,所以像字符串这样的成员构造不正确。

在这种情况下,您应该使用new/delete

Employee employee = new Employee_S();

此外,使用指针也没有意义,代码更简单、更安全:

struct Employee_S {
    string ID;
        string name; 
        string surname;
    int age;
    double salary;
};

对于默认的init Employee_S成员,只需编写

 Employee_S  es = {};

必须使用运算符new而不是C函数malloc。调用malloc时,不会创建类型为std::string的对象。函数malloc不调用对象的构造函数。

函数employee_init可能看起来像

Employee employee_init() {
    Employee employee = new Employee_t();
    return employee;
}

此外,如果您打算使用Employee_S类型的数组,那么最好使用std::vector。在这种情况下,不需要该函数。你可以简单地定义

std::vector<Employee_S> employee;