在一次采访中,有人问我这个问题:
在 C++ 中,
- 如果我们使用分配内存
malloc并使用delete释放分配的内存怎么办?- 如果我们使用分配内存
new并使用释放它free呢?如果在代码中使用上述的东西,我们会面临哪些问题?
我的回答是没有区别。我这样说对吗?
在一次采访中,有人问我这个问题:
在 C++ 中,
- 如果我们使用分配内存
malloc并使用delete释放分配的内存怎么办?- 如果我们使用分配内存
new并使用释放它free呢?如果在代码中使用上述的东西,我们会面临哪些问题?
我的回答是没有区别。我这样说对吗?
如果这样做,您将遇到未定义的行为。永远不要那样做。尽管new可能通过malloc()并且delete可能通过free()但不能保证它们确实以这种方式实现,并且用户可以自行决定是否超载。您可能会遇到堆损坏。newdelete
除此之外,不要忘记,当你调用时,malloc()你会得到原始内存——没有调用构造函数——当你调用时free()没有调用析构函数。这也可能导致程序的未定义行为和不正常运行。
底线是......永远不要这样做。
1)未定义的行为,但可能会“工作”。析构函数将在被释放的可能不想被解构的内存上调用。
2)未定义的行为,但可能会“工作”。析构函数不会被调用。
即,如果它可以工作,并且不能保证,那么它可能只会完全按照基本内置数据类型的要求工作。