new和mallo的区别
1、new是c++操作符
调用new的时候会分配内存+调用构造函数,对应的释放内存时使用delete,清理内存+调用析构函数
返回的类型就是实际类型指针
MyClass* obj = new MyClass(42);
2、malloc是c风格的函数
调用malloc时只分配内存,不调用构造函数,对应的释放内存时使用free,只清理内存不调析构函数
另外malloc返回的是void* 类型,需要强制类型转换,需要指定大小
void* ptr = malloc(sizeof(MyClass));
MyClass* myClass = new (ptr) MyClass(42);
3、C++使用new和delete
如果构造类,要使用malloc,那还需要手动调用一次构造函数,或者手动调用new来调用构造函数;
都是在堆上分配内存
4、标准库的new操作符重载
new操作符是可以被重载的 placement new
当我们这么使用的时候
void* raw = malloc(sizeof(MyClass));
MyClass* myClass = new (ptr) MyClass(42);
编译器实际上执行的是:
void* raw = malloc(sizeof(MyClass));
void* ptr = operator new(sizeof(MyClass), raw);
MyClass* obj = static_cast<MyClass*>(ptr*);
obj->MyClass::MyClass(123);
operator new源码:
inline void* operator new(std::size_t, void *ptr) noexcept {return ptr;
}
也就是说:构造函数的调用不是写在 operator new 里,而是语法糖帮你自动生成的代码逻辑。
5、值类型申请内存能用 new 吗?还是不需要?
可以用,但是没必要,直接在栈上申请更方便
struct Point {int x = 0;int y = 0;
}
Point * p = new Point(1, 2}; // 给指针分配堆内存
Point point{1, 2}; //给对象直接分配栈内存
6、.vector 分配内存时用得到 new 吗?
Allocator
标准库的 std::vector 需要动态管理内存,储存动态数量的元素。
实际上,std::vector 使用的是**分配器(Allocator)**来申请内存,默认是 std::allocator。
std::allocator 底层通常会调用 operator new 来分配原始内存:
分配的内存是原始内存,没有调用构造函数。
然后 vector 会调用元素的构造函数在这块内存上逐个构造元素。
7、如果只分配内存,不调用构造函数,这个类对象未完成构造,虚函数指针,成员变量未初始化,对象不完整;
8、delete调用的析构函数是
delete data
delete这里调用的析构函数是data类型的析构,如果data是一个class则会调用它的析构,如果data是int *,则其根本没有析构函数