MST

星途 面试题库

面试题:C++ 指针与内存管理

假设有一个类`MyClass`,包含一些成员变量和成员函数。请编写代码实现一个函数,该函数接收一个`MyClass`对象的指针,在函数内部动态分配一块内存并将其地址赋给`MyClass`对象的一个指针成员变量,然后在函数结束前正确释放这块内存,确保没有内存泄漏。请阐述在这个过程中构造函数、析构函数以及`delete`操作符的使用要点和注意事项。
47.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

以下是代码实现:

#include <iostream>

class MyClass {
public:
    int* ptr;
    MyClass() : ptr(nullptr) {}
    ~MyClass() {
        if (ptr) {
            delete ptr;
        }
    }
};

void allocateAndRelease(MyClass* obj) {
    int* temp = new int(42);
    obj->ptr = temp;
    // 做一些其他操作
    delete obj->ptr;
    obj->ptr = nullptr;
}

构造函数要点及注意事项:

  • 初始化指针成员变量:在构造函数中,将指针成员变量初始化为 nullptr,这是一个良好的编程习惯,可以避免野指针问题。

析构函数要点及注意事项:

  • 检查指针有效性:在析构函数中,使用 if 语句检查指针是否为 nullptr,只有当指针不为 nullptr 时才调用 delete 操作符,防止对空指针进行 delete 操作,这会导致未定义行为。
  • 释放内存:在确认指针有效后,调用 delete 操作符释放指针指向的内存,确保对象销毁时不会造成内存泄漏。

delete 操作符要点及注意事项:

  • 匹配 new 操作:使用 delete 操作符释放内存时,要确保它与对应的 new 操作相匹配。例如,使用 new 分配单个对象,就要使用 delete 释放;使用 new[] 分配数组,就要使用 delete[] 释放。在上述代码中,因为使用 new int 分配内存,所以使用 delete 释放。
  • 避免重复释放:确保不要对同一个指针多次调用 delete 操作符,在释放内存后,最好将指针赋值为 nullptr,防止不小心再次使用已释放的指针。在上述代码中,在 delete 后将 obj->ptr 赋值为 nullptr