今天写代码遇到一个问题。如下的结构体:
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); |