今天写代码遇到一个问题。如下的结构体:
1 | struct A |
2 | { |
3 | string str; |
4 | int data; |
5 | //.... |
6 | }; |
在代码中需要动态为这个结构体分配内存,习惯性的:
1 | A *a = (A *) malloc ( sizeof (A)); |
然后为 str 赋值输出:
1 | a->str = "testdata" ; |
2 | cout << a->str << endl; |
结果直接 Segment Fault!了。
google下,原来是调用 malloc 并不调用string的构造函数,导致 str 未初始化。要避免这样的问题,用 C 的方式可以使用字符数组(char *str),或者在 C++里这样使用:
1 | 1、A *a = new A; //使用 new 会调用成员的构造函数 |
2 | //。。。 |
3 | delete a; |
或者(待验证)
1 | 2、 void *v = malloc ( sizeof (A)); |
2 | A *a = new (v)A; |
3 | //...... |
4 | a->~A(); |
5 | free (v); |