C++Segfault追加、push_back和运算符=或+=
C++ Segfault appending, push_back and operator = or +=
我有一个非常简单的代码可以从文件中读取,并将字符附加到字符串中,并生成结构的数组。我用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;
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<