删除 C++ 中指针指向的内存后,我遇到了未定义的行为。当使用分配给同一内存位置的多个指针时,如何避免此问题?
#include <iostream>
using namespace std;
class MyClass {
private:
int data;
public:
MyClass(int d) : data(d) {}
int getData() const {
return data;
}
};
int main() {
MyClass *ptr = new MyClass(5);
cout << "Data using pointer: " << ptr->getData() << endl;
MyClass *anotherPtr = ptr;
delete ptr;
cout << "Data using another pointer after deletion: " << anotherPtr->getData() << endl;
return 0;
}
这个问题没有一个简单的答案。您询问如何避免 CWE-416:Use After Free 错误,并且有多种解决方案:
-fsanitize=address,undefined
等消毒剂)
new
/delete
,而是使用std::unique_ptr
和std::shared_ptr
等智能指针。如果使用得当,这些包装器使得在指针被释放后就不可能意外使用它。
其中,最有效的解决方案是智能指针。它们模拟唯一/共享所有权,除非您通过
release()
ing/get()
ing 原始指针来打破它,否则不可能编写 Use After Free 错误。当您已经编写了错误时,运行时检查和静态分析可以被视为 PPE(个人防护装备)。