1.malloc、calloc、realloc、alloca的作用
- malloc:动态分配内存。
- 函数原型:void* malloc(size_t size)
- 作用:在堆上分配指定大小的内存块。返回指向分配内存起始位置的指针或者NULL(如果分配失败)。
- 注意事项:使用malloc分配的内存中的内容是未初始化的,需要手动进行初始化。
- calloc:动态分配并清零内存。
- 函数原型:void* calloc(size_t num, size_t size)
- 作用:在堆上分配指定数量和大小的内存块,并将每个字节都设置为0。返回指向分配内存起始位置的指针或者NULL(如果分配失败)。
- 注意事项:使用calloc分配的内存已经被初始化为0,无需额外操作。
- realloc:重新调整内存块大小。
- 函数原型:void* realloc(void* ptr, size_t size)
- 作用:重新调整之前分配的内存块的大小。可以扩大或缩小内存块的大小。返回指向扩展/缩小后内存起始位置的指针或者NULL(如果调整失败)。
- 注意事项:realloc可能会更改内存块的位置,因此应该谨慎处理指向旧内存块的指针。
- alloca:在栈上动态分配内存。
- 函数原型:void* alloca(size_t size)
- 作用:在栈上临时分配指定大小的内存块。随着函数的返回,内存块会自动释放。
- 注意事项:使用alloca分配的内存只在函数的生命周期内有效,不需要手动释放。然而,由于在栈上分配,应谨慎使用,以免栈溢出等问题。
2.new和delete的作用
new:动态分配内存并构造对象。
delete:释放动态分配的内存并销毁对象。
3.delete this合法么
合法,但是必须保证
- 必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的
- 必须保证调用 delete this 的成员函数是最后一个调用 this 的成员函数
- 必须确保不会在delete this之后继续使用该对象的指针,否则会导致悬挂指针的问题。
- 不要在其他成员函数中使用delete this
4.new和malloc的区别
- 用法和语法:
- new是一个运算符
- malloc是一个函数
- 类型安全:
- new会进行类型检查,并在需要时调用构造函数初始化对象。
- malloc只是简单地分配指定大小的内存块,不进行类型检查和对象的构造。
- 内存分配大小:
- new根据类型信息自动计算所需内存的大小。
- malloc需要手动指定要分配的内存大小。
- 返回类型:
- new返回指向分配内存的指针,且与要分配的类型相匹配。
- malloc返回void*指针,需要手动进行类型转换。
- 构造函数和析构函数的调用:
- new在分配内存后,会调用相应类型的构造函数来初始化对象。
- malloc不会调用构造函数,需要手动初始化对象。
- 内存释放:
- new使用delete来释放动态分配的内存,同时会调用析构函数。
- malloc使用free来释放动态分配的内存,不会调用析构函数。