关于new/delete和malloc/free的一些性能说明:
malloc和free 不分别调用构造函数和解构函数.这意味着你的课程不会被自动化或自动取消初始化,这可能是不好的(例如未经执行的指针)!这对于像char和double这样的POD数据类型无关紧要,因为它们实际上没有ctor.
new和delete 会调用构造函数和解构函数.这意味着您的类实例会被初始化并自动取消初始化.但是,通常会出现性能损失(与普通分配相比),但这样做会更好.
我建议保持与new/malloc使用一致,除非你有理由(例如realloc).这样,您可以减少依赖关系,减少代码大小和加载时间(但只能通过smidgin).此外,你不会因为使用new分配的东西,或删除使用malloc分配的内容而陷入困境.(这很可能会导致崩溃!)
关于new/delete和malloc/free的一些性能说明:
malloc和free 不分别调用构造函数和解构函数.这意味着你的课程不会被自动化或自动取消初始化,这可能是不好的(例如未经执行的指针)!这对于像char和double这样的POD数据类型无关紧要,因为它们实际上没有ctor.
new和delete 会调用构造函数和解构函数.这意味着您的类实例会被初始化并自动取消初始化.但是,通常会出现性能损失(与普通分配相比),但这样做会更好.
我建议保持与new/malloc使用一致,除非你有理由(例如realloc).这样,您可以减少依赖关系,减少代码大小和加载时间(但只能通过smidgin).此外,你不会因为使用new分配的东西,或删除使用malloc分配的内容而陷入困境.(这很可能会导致崩溃!)
答1:两者free(p)
并delete p
用NULL指针正常工作.
答案2:没有看到代码的缓慢部分就无法回答.你应该分析代码!如果您使用的是Linux,我建议使用Callgrind(Valgrind的一部分)来查找执行的哪些部分花费的时间最多.
问题一:什么都不会发生.
从目前的ISO/IEC 14882(或:C++)草案:
20.8.15 C库[c.malloc]
内容[of
,即:where
free
lives,]与标准C库[(参见intro.refs)]标题相同,并带有以下更改:[不会影响此答案].
因此,从ISO/IEC 9899:1999(或:C):
7.20.3.2
free
功能如果[[]]
ptr
[参数]是空指针,则不执行任何操作.
再次从C++标准,有关delete
此时间的信息:
3.7.4.2释放函数[basic.stc.dynamic.deallocation]
提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.
也可以看看:
new
/ delete
和malloc
/有free
什么区别?
当你尝试在c中free()
已经free
存储时会发生什么?