面试题答案
一键面试以下是代码实现:
#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
。