如何在C++中使用内存分配和释放?

  • Post category:cplus

在C++中使用内存分配和释放主要涉及到两个操作符:newdelete,以及两个函数:malloc()free()。其中,newdeletemalloc()free()更常用。

使用new操作符分配内存

new操作符可以用于在堆上分配内存,并返回一个指向所分配内存的指针。它的语法如下:

int *p = new int;

以上语句分配了一个整型变量的内存,并将其地址赋值给指针变量p。我们也可以在分配内存时进行初始化,例如:

int *p = new int(42);

以上语句分配了一个整型变量的内存,并将其初始化为42,然后将其地址赋值给指针变量p

使用new时,需要注意以下几点:

  • 内存分配成功后,需要手动释放对应的内存,否则会导致内存泄漏。
  • 分配的内存可使用指针访问,但无法使用变量名直接访问。
  • 若在分配内存时出现错误,会抛出std::bad_alloc异常,需要进行异常处理。

下面是一个new操作符的示例:

#include <iostream>

using namespace std;

int main() {
    int *p = nullptr; // 初始化指针为nullptr

    try {
        p = new int(10); // 分配一个整型变量的内存,并将其初始化为10
    } catch (const std::bad_alloc &e) { // 异常处理
        cerr << "Memory allocation failed: " << e.what() << endl;
        return 1;
    }

    cout << "The value of p is: " << *p << endl;

    delete p; // 释放内存

    return 0;
}

上述示例使用了delete操作符来释放内存。

使用malloc函数分配内存

malloc()函数是C语言中用于动态分配内存的函数,主要用于在堆上动态分配内存。它的语法如下:

int *p = (int *)malloc(sizeof(int));

以上语句分配了一个整型变量的内存,并将其地址赋值给指针变量p。使用malloc()分配内存时,需要注意以下几点:

  • 返回值为void*类型,需要进行强制类型转换。
  • 内存分配成功后,需要手动释放对应的内存,否则会导致内存泄漏。
  • 分配的内存可使用指针访问,但无法使用变量名直接访问。
  • 若在分配内存时出现错误,会返回nullptr

下面是一个malloc()函数的示例:

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
    int *p = static_cast<int *>(malloc(sizeof(int))); // 强制类型转换

    if (p == nullptr) { // 错误处理
        cerr << "Memory allocation failed." << endl;
        return 1;
    }

    *p = 10; // 对分配的内存赋值

    cout << "The value of p is: " << *p << endl;

    free(p); // 释放内存

    return 0;
}

上述示例使用了free()函数来释放内存。

注意事项

需要注意的是,newmalloc()在某些情况下不能互相替代。例如,使用new分配一个类对象的内存时,除了分配内存外还需要调用构造函数,而malloc()则不能实现这一功能。另外,RAII机制使用newdelete操作符实现了资源管理,使用malloc()free()时需要手动管理内存,若不小心出现内存泄漏等问题,会导致程序出现严重错误。

使用delete操作符释放内存

在使用new操作符动态分配内存后,需要使用delete操作符来释放所分配的内存。它的语法如下:

delete p;

其中,p是一个指向所分配内存的指针。需要注意以下几点:

  • 使用delete时,只能用于释放使用new所分配的内存,不能释放使用malloc()等函数所分配的内存。
  • 使用delete时,需要使用与new相应的析构函数来销毁对象。
  • 在释放内存后,需要将指针变量设为nullptr,以避免悬空指针带来的问题。

下面是一个delete操作符的示例:

#include <iostream>

using namespace std;

class MyClass {
public:
    MyClass(int n) : num(n) {}

    ~MyClass() { cout << "MyClass destructor." << endl; }

private:
    int num;
};

int main() {
    MyClass *p = new MyClass(10);

    delete p;
    p = nullptr;

    return 0;
}

上述示例中,定义了一个类MyClass,使用new操作符创建了该类的对象,并使用delete操作符释放了所分配的内存。在类中重写了析构函数,以便在对象被删除时输出信息。

使用free函数释放内存

在使用malloc()函数动态分配内存后,需要使用free()函数来释放所分配的内存。它的语法如下:

free(p);

其中,p是一个指向所分配内存的指针。需要注意以下几点:

  • 使用free()时,只能用于释放使用malloc()等函数所分配的内存,不能释放使用new所分配的内存。
  • 在释放内存后,需要将指针变量设为nullptr,以避免悬空指针带来的问题。

下面是一个free()函数的示例:

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
    int *p = static_cast<int *>(malloc(sizeof(int)));

    if (p == nullptr) {
        cerr << "Memory allocation failed." << endl;
        return 1;
    }

    *p = 10;

    cout << "The value of p is: " << *p << endl;

    free(p);
    p = nullptr;

    return 0;
}

上述示例中,使用malloc()函数分配了一个整型变量的内存,并使用free()函数释放了所分配的内存。在释放内存后,将指针变量设为空指针,以避免悬空指针。