问题描述
我在使用Qt时遇到了一个问题,我自定义了一个结构体,声明一个结构体指针,使用malloc为他分配内存空间,然后为结构体中的成员变量赋值,具体如下:
struct node{
QString str;
struct node *next;
};
void fun(){
struct node *pointer;
pointer=(struct node*)malloc(sizeof(struct node));
if(pointer==NULL){
qDebug()<<("malloc error");
return;
}
pointer->str="456";
pointer->next=NULL;
}
程序运行时总是崩溃,调试结果是在第12行为str成员变量赋值时出现segmentation fault。
出错原因
这是由于使用了malloc为非POD类型分配内存空间,malloc只是分配内存,而不进行初始化。而C++中只能使用malloc为POD类型分配内存,其他的必须使用new运算符分配内存。(POD类型详见文末链接)
malloc和new的区别
malloc函数分配内存空间时并不调用构造函数,同样free函数在回收内存空间时也不调用析构函数。
new运算符和delete运算符在分配和回收内存空间时调用构造/析构函数。
QString类型并不属于POD类型,所以含有他的node结构体也就不属于POD类型
解决方法
为指针分配内存时不使用malloc函数,而是使用new运算符
void fun(){
struct node *pointer;
pointer = new struct node;
pointer->str="456";
pointer->next=NULL;
}
总结:在C++中为指针分配内存空间时,尽量使用new操作符,而不使用malloc函数。
POD类型说明转载链接:
c/c++ pod类型介绍
理解POD数据类型