当使用分配给同一内存位置的多个指针时,如何在删除 C++ 中指针指向的内存后避免未定义的行为?

问题描述 投票:0回答:1

删除 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;
}
c++ pointers debugging memory-management undefined-behavior
1个回答
0
投票

这个问题没有一个简单的答案。您询问如何避免 CWE-416:Use After Free 错误,并且有多种解决方案:

  1. 使用运行时分析检测 Use After Free 错误(例如
    -fsanitize=address,undefined
    等消毒剂)
  2. 如果可能,使用静态分析和/或编译器警告检测 Use After Free。
  3. 不要直接使用
    new
    /
    delete
    ,而是使用
    std::unique_ptr
    std::shared_ptr
    等智能指针。如果使用得当,这些包装器使得在指针被释放后就不可能意外使用它。

其中,最有效的解决方案是智能指针。它们模拟唯一/共享所有权,除非您通过

release()
ing/
get()
ing 原始指针来打破它,否则不可能编写 Use After Free 错误。当您已经编写了错误时,运行时检查和静态分析可以被视为 PPE(个人防护装备)。

© www.soinside.com 2019 - 2024. All rights reserved.