New和Malloc的区别

一、New和Malloc的作用

New和Malloc都是动态内存分配的函数,可以在程序运行时为变量动态分配内存。

New是C++的标准运算符,它为对象动态分配内存,并调用构造函数初始化对象。在分配内存时,不需要指定内存空间大小,因为编译器会通过类型推断自动计算内存大小。

Malloc是C语言的标准函数,它允许程序在运行时为变量分配内存。在分配内存时需要指定内存空间大小,也就是分配的字节数。

// New的示例代码
#include

using namespace std;

int main() {
    int *p = new int;
    *p = 10;
    cout << *p << endl;
    delete p;
    return 0;
}

// Malloc的示例代码
#include 
#include 

int main() {
  int *p = (int*)malloc(sizeof(int));
  *p = 10;
  printf("%d\n", *p);
  free(p);
  return 0;
}

二、New和Malloc的实现方式

New和Malloc的实现方式不同。

New是调用operator new函数来实现动态内存分配。当执行new操作时,编译器首先调用operator new函数来分配内存,然后才调用构造函数来初始化对象。用户可以重载operator new来改变内存分配策略。

Malloc是调用操作系统提供的动态内存分配函数来实现的。操作系统为Malloc分配的内存会放在内存堆中,由程序员负责管理。Malloc分配的内存空间可以通过free释放掉。

// operator new的示例代码
#include

using namespace std;

void* operator new(size_t n)
{
    cout << "Allocating " << n << " bytes." << endl;
    void* p = malloc(n);
    return p;
}

void operator delete(void* p)
{
    cout << "Deallocating memory." << endl;
    free(p);
}

class Student {
public:
    Student() {
        cout << "Constructing Student object." << endl;
    }

    ~Student() {
        cout << "Destructing Student object." << endl;
    }
};

int main() {
    Student* pStu = new Student;
    delete pStu;
 
    return 0;
}

三、New和Malloc的错误处理

New和Malloc的错误处理方式也不同。

New在分配内存失败时,会抛出std::bad_alloc异常。程序员可以通过捕获这个异常来处理分配内存失败的情况,也可以选择不处理,让程序崩溃。

而Malloc在分配内存失败时,返回NULL指针。程序员需要在分配内存操作后检查返回值是否为NULL,如果是,说明内存分配失败。

// std::bad_alloc的示例代码
#include
#include

using namespace std;

int main() {
    try {
        int* p = new int[1000000000000000];
    }
    catch (bad_alloc& e) {
        cout << "Allocation failed: " << e.what() << endl;
    }
    return 0;
}

// Malloc返回NULL指针的示例代码
#include 
#include 

int main() {
  int *p = (int*)malloc(sizeof(int)*1000000000000000);
  if(p == NULL) {
    printf("Allocation failed\n");
    exit(1);
  }
  free(p);
  return 0;
}

四、New和Malloc的适用场景

New和Malloc适用于不同的场景。

New适用于C++中对象的动态分配,可以自动调用构造函数初始化对象。

而Malloc适用于C语言中变量的动态分配,不会调用构造函数,程序员需要手动初始化变量。Malloc还适用于内存池的实现,因为它可以在堆中分配一段连续的内存空间。

// 适用New的示例代码
#include
using namespace std;

class Person {
    public:
        Person(int age) : m_age(age) {
        }

        void printAge() {
            cout << "Age: " << m_age <printAge();
    delete p;
    return 0;
}

// 适用Malloc的示例代码
#include
#include

struct Student {
    int id;
    int age;
};

int main() {
    // 手动初始化
    struct Student* pStu = (struct Student*)malloc(sizeof(struct Student));
    pStu->id = 1;
    pStu->age = 20;

    printf("id: %d, age: %d\n", pStu->id, pStu->age);

    free(pStu);
    return 0;
}

五、New和Malloc的内存对齐

New和Malloc在分配内存时都要考虑内存对齐的问题。

C++中的new运算符会保证分配的内存空间满足所分配类型的对齐要求。例如,如果分配一个int类型的内存空间,那么它的起始地址必定是4的倍数。

而C语言的malloc函数则需要手动指定分配的内存空间大小,也需要手动保证内存对齐。

// New的内存对齐示例代码
#include
using namespace std;

class Student {
    public:
        Student(int age) : m_age(age) {
        }

        void printAge() {
            cout << "Age: " << m_age << endl;
        }

    private:
        int m_age;
};

int main() {
    Student* p = new Student(20);
    cout << "sizeof(Student): " << sizeof(Student) << endl;
    cout << "p address: " << p << endl;
    delete p;
    return 0;
}

// Malloc的内存对齐示例代码
#include
#include

int main() {
    // 分配8字节内存,但只使用了4字节
    int* p = (int*)malloc(sizeof(int));
    
    // 输出指针地址,和所占字节数
    printf("p address: %p, size: %u\n", p, sizeof(*p));
    free(p);
    return 0;
}

原创文章,作者:ELLAX,如若转载,请注明出处:https://www.506064.com/n/332798.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ELLAXELLAX
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相关推荐

  • Python中new和init的区别

    new和init都是Python中常用的魔法方法,它们分别负责对象的创建和初始化,本文将从多个角度详细阐述它们的区别。 一、创建对象 new方法是用来创建一个对象的,它是一个类级别…

    编程 2025-04-29
  • Sublime Test与Python的区别

    Sublime Text是一款流行的文本编辑器,而Python是一种广泛使用的编程语言。虽然Sublime Text可以用于编写Python代码,但它们之间有很多不同之处。接下来从…

    编程 2025-04-29
  • Shell脚本与Python脚本的区别

    本文将从多个方面对Shell脚本与Python脚本的区别做详细的阐述。 一、语法差异 Shell脚本和Python脚本的语法存在明显差异。 Shell脚本是一种基于字符命令行的语言…

    编程 2025-04-29
  • Python中while语句和for语句的区别

    while语句和for语句是Python中两种常见的循环语句,它们都可以用于重复执行一段代码。然而,它们的语法和适用场景有所不同。本文将从多个方面详细阐述Python中while语…

    编程 2025-04-29
  • Web程序和桌面程序的区别

    Web程序和桌面程序都是进行软件开发的方式,但是它们之间存在很大的区别。本文将从多角度进行阐述。 一、运行方式 Web程序运行于互联网上,用户可以通过使用浏览器来访问它。而桌面程序…

    编程 2025-04-29
  • TensorFlow和Python的区别

    TensorFlow和Python是现如今最受欢迎的机器学习平台和编程语言。虽然两者都处于机器学习领域的主流阵营,但它们有很多区别。本文将从多个方面对TensorFlow和Pyth…

    编程 2025-04-28
  • 麦语言与Python的区别

    麦语言和Python都是非常受欢迎的编程语言。它们各自有自己的优缺点和适合的应用场景。本文将从语言特性、语法、生态系统等多个方面,对麦语言和Python进行详细比较和阐述。 一、语…

    编程 2025-04-28
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28
  • Python与C语言的区别和联系

    Python与C语言是两种常用的编程语言,虽然两者都可以用于编写软件程序,但是它们之间有很多不同之处。本文将从多个方面对Python与C语言的区别和联系进行详细的阐述。 一、语法特…

    编程 2025-04-28
  • Python中深拷贝和浅拷贝的区别

    本文将从以下几个方面对Python中深拷贝和浅拷贝的区别做详细的阐述,包括:拷贝的含义、变量和对象的区别、浅拷贝的示例、深拷贝的示例、可变对象和不可变对象的区别、嵌套的数据结构以及…

    编程 2025-04-28

发表回复

登录后才能评论