DuLNode *p = new DuLNode;//使用这句可以正确执行,而使用下面的语句无法执行
//DuLNode *p = (DuLNode *)malloc(sizeof(DuLNode));
使用第一句可以顺利执行,下面一句会报错,除这两句之外无任何差别
DuLNode *p = new DuLNode;//使用这句可以正确执行,而使用下面的语句无法执行
//DuLNode *p = (DuLNode *)malloc(sizeof(DuLNode));
使用第一句可以顺利执行,下面一句会报错,除这两句之外无任何差别
理论上来讲,只有第二句进行指针赋值的话,是不会有问题的,毕竟等号左右都只是一个指针。
但是如果后续用类的指针进行赋值等操作时,就有可能出现问题。例如,若DuLNode 类中有string类型的成员变量s,在用new申请内存时,new会调用构造函数对变量s进行必要的初始化,会将为s分配的最后一个字节的内存设置为'\n',使得变量s可以正常进行赋值和读取。但是,如果是用malloc申请的内存,返回的是一个void*的原始内存块,内部没有做任何初始化,即使强制转换为(DuLNode*),其本质还是原始内存块,在对变量s进行操作时,就会报错。
此外,用malloc申请内存时,需要指定内存大小,申请后得到的就是一个固定大小的内存。而用new申请的std::string类型的内存,程序会根据需要进行重新申请和分配内存。