一、new和malloc的基本概念
new和malloc都是用于动态分配内存的函数。dynamic memory allocation是指在程序运行时动态分配内存,也称堆分配(heap allocation),与静态内存分配(即编译时内存分配)相对应。C++引入了new和delete来代替C语言中常用的malloc和free。
malloc(memory allocation)函数定义在stdlib.h头文件中。malloc函数申请一块指定大小的内存块,并返回指向该内存块的指针。内存中的数据是未初始化的,需要使用memset函数来清零。
new和delete是C++的关键字,是一对运算符。使用new运算符可以动态分配内存,并返回指向新内存的指针,而使用delete则可以将内存释放。
//malloc的用法示例
#include
int main(){
    int *p = (int*)malloc(sizeof(int));
    *p = 10;
    free(p);
    return 0;
}
//new的用法示例
#include
int main(){
    int *p = new int;
    *p = 10;
    delete p;
    return 0;
}
二、new与malloc的区别
1.返回值类型不同
malloc返回void类型指针,在C++语言中需要进行强制类型转换才能赋值给指定类型的指针。new则返回指定类型的指针,不需要进行强制类型转换。
#include
#include
int main(){
    int *p = (int*)malloc(sizeof(int));
    int *q = new int;
    std::cout << typeid(p).name() << std::endl;
    std::cout << typeid(q).name() << std::endl;
    free(p);
    delete q;
    return 0;
}
//运行结果:Pv(void指针类型), Pi(int指针类型)
2.运算符重载
new和delete是C++的关键字,是一对运算符,支持重载。使用new可以自动调用构造函数,使用delete可以自动调用析构函数。
#include
class A{
public:
    A(){std::cout << "A constructor" << std::endl;}
    ~A(){std::cout << "A destructor" << std::endl;}
};
int main(){
    A *a1 = (A*)malloc(sizeof(A));
    A *a2 = new A();
    free(a1);
    delete a2;
    return 0;
}
//运行结果只有new能调用构造函数和析构函数
3.内存越界检查
new进行内存分配时,会进行越界检查。
#include
#define LEN 10
int main(){
    int *p1 = (int*)malloc(sizeof(int) * LEN);
    int *p2 = new int[LEN];
    for(int i = 0; i < LEN+5; ++i){
        std::cout << p1[i] << " ";  //越界访问p1,并不会抛出异常
    }
    std::cout << std::endl;
    for(int i = 0; i < LEN+5; ++i){
        std::cout << p1[i] << " ";  //越界访问p2,会抛出异常
    }
    free(p1);
    delete[] p2;
    return 0;
}
4.分配对象空间不同
new可以同时分配对象和空间,而malloc只能分配空间。
#include
#include
class A{
public:
    int x;
    char* str;
};
int main(){
    A *a1 = (A*)malloc(sizeof(A));  //只分配空间,需要手动初始化对象
    a1->x = 1;
    a1->str = (char*)malloc(sizeof(char) * 10);
    strcpy(a1->str, "hello");
    std::cout << "x = " <x << ", str = " <str <str);
    free(a1);
    A *a2 = new A();  //分配空间并初始化对象
    a2->x = 2;
    a2->str = (char*)malloc(sizeof(char) * 10);
    strcpy(a2->str, "world");
    std::cout << "x = " <x << ", str = " <str <str);
    delete a2;
    return 0;
}
三、小结
new和malloc都是用于动态分配内存的函数。new和delete是C++的关键字,支持运算符重载和对析构函数的调用,可以自动调用构造函数和析构函数。new进行内存分配时会进行内存越界检查,malloc不会。new可以同时分配对象和空间,而malloc只能分配空间。选择使用哪个函数,需要结合具体的情况来考虑。
原创文章,作者:KJHQB,如若转载,请注明出处:https://www.506064.com/n/332953.html
 
 微信扫一扫
微信扫一扫  支付宝扫一扫
支付宝扫一扫 