当前位置:首页 C++ > 正文

C++new与malloc的区别

作者:野牛程序员:2023-07-10 09:33:38 C++阅读 2700

C++中的newmalloc()是用于动态分配内存的两个不同的机制。它们之间有以下几个区别:

  1. 语法:new是一个运算符,而malloc()是一个函数。

    • new用于创建对象,例如:int* ptr = new int;

    • malloc()用于分配内存块,例如:int* ptr = (int*)malloc(sizeof(int));

  2. 类型安全:new是类型安全的,它会自动进行类型推导和构造函数的调用。而malloc()返回的是void*指针,需要进行显式的类型转换,并且不会调用对象的构造函数。

    • new int;会调用int的默认构造函数。

    • malloc(sizeof(int));只会分配内存,不会调用任何构造函数。

  3. 内存大小:new可以自动计算对象的大小,而malloc()需要手动指定分配的内存大小。

    • new int;会分配一个int对象所需的内存大小。

    • malloc(sizeof(int));需要手动指定int对象的大小。

  4. 错误处理:new在分配内存失败时会抛出std::bad_alloc异常,而malloc()在分配失败时返回NULL指针。

    • int* ptr = new int;如果内存分配失败,会抛出异常。

    • int* ptr = (int*)malloc(sizeof(int));如果内存分配失败,ptr将为NULL

  5. 构造和析构函数的调用:new在分配内存后会调用对象的构造函数,而malloc()不会调用构造函数和析构函数。

    • new int;会调用int的构造函数进行对象的初始化。

    • malloc(sizeof(int));不会调用任何构造函数。

  6. 针对自定义类型:new可以处理自定义类型,而malloc()只是分配内存块,并不能初始化自定义类型的成员变量。

    • new MyClass;会调用MyClass的构造函数进行对象的初始化。

    • malloc(sizeof(MyClass));只会分配内存,不会调用MyClass的构造函数。

总的来说,使用new会更方便、类型安全,并且可以自动调用对象的构造函数和析构函数。而malloc()更为底层,需要手动管理内存分配和释放,并且不处理对象的构造和析构。在C++中,推荐使用newdelete运算符来进行内存管理。

以下是使用newmalloc()的代码示例:

使用new

#include <iostream>

class MyClass {
public:
  MyClass() {
    std::cout << "Constructor called!" << std::endl;
  }
  ~MyClass() {
    std::cout << "Destructor called!" << std::endl;
  }
};

int main() {
  // 使用new分配和初始化单个int对象
  int* intPtr = new int;
  *intPtr = 10;
  std::cout << *intPtr << std::endl;
  delete intPtr;

  // 使用new分配和初始化自定义类型的对象
  MyClass* objPtr = new MyClass;
  delete objPtr;

  return 0;
}

使用malloc()

#include <iostream>
#include <cstdlib>

class MyClass {
public:
  MyClass() {
    std::cout << "Constructor called!" << std::endl;
  }
  ~MyClass() {
    std::cout << "Destructor called!" << std::endl;
  }
};

int main() {
  // 使用malloc分配内存
  int* intPtr = (int*)malloc(sizeof(int));
  *intPtr = 10;
  std::cout << *intPtr << std::endl;
  free(intPtr);

  // 使用malloc分配内存,但不会调用构造函数
  MyClass* objPtr = (MyClass*)malloc(sizeof(MyClass));

  // 必要时,显式调用构造函数初始化对象
  new (objPtr) MyClass;

  // 必要时,显式调用析构函数销毁对象
  objPtr->~MyClass();

  // 释放内存
  free(objPtr);

  return 0;
}

请注意,对于自定义类型,使用malloc()只会分配内存,需要显式调用构造函数进行对象的初始化,以及在适当的时候调用析构函数进行对象的销毁。而使用new会自动处理对象的构造和析构。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击