报内存错误的代码:
顺利执行的代码:
可以看到在malloc为a开好空间,然后对自定义类型对象a中的string a成员进行赋值的时候,发生了内存错误,但是经过测试,使用new为string a开空间就不会发生错误;
new和malloc最本质的区别
最主要的本质区别:new会调用开空间对象的构造函数,malloc不会简单无脑直接开空间;
关于new操作符底层封装malloc,加了抛异常机制,还有他们用法上的区别这些就不谈了;
这样,上面malloc string的问题就可以解释了;
原因
首先C++内置string字符串自定义类型,一般new为string开空间的时候,string底层会在 构造函数调用过程中 在堆上再开一个char*的空间(malloc或者new为string开了空间,而string的构造函数还得为内部成员char*再开一个空间的),这个二次开的空间相当于是个变长