C++ C++;类成员指针 使用名称空间std; 班级线{ 公众: int getLength(void); 线(内线); ~Line(); int*get(); int*ptr; }; int行::getLength(){ 库特

C++ C++;类成员指针 使用名称空间std; 班级线{ 公众: int getLength(void); 线(内线); ~Line(); int*get(); int*ptr; }; int行::getLength(){ 库特,c++,C++,这是为什么 因为程序的行为是未定义的 在构造函数中,ptr指向具有自动存储的参数。当构造函数返回时,参数的存储持续时间结束,指针变为无效。当您稍后间接通过无效指针并尝试访问内存时,行为未定义。它是10,在范围内在构造函数中,它位于输出的前2个字符中 using namespace std; class Line { public: int getLength(void); Line(int len); ~Line(); int *get(); int *

这是为什么

因为程序的行为是未定义的


在构造函数中,
ptr
指向具有自动存储的参数。当构造函数返回时,参数的存储持续时间结束,指针变为无效。当您稍后间接通过无效指针并尝试访问内存时,行为未定义。

它是10,在范围内在构造函数中,它位于输出的前2个字符中

using namespace std;

class Line {
public:
    int getLength(void);
    Line(int len);
    ~Line();
    int *get();
    int *ptr;
};

int Line::getLength() {
    cout << *ptr << "\t";
    return *ptr;
}

Line::Line(int len) {
    ptr = &len;
    cout << *ptr << "\t";
    cout << ptr << "\t";
}


Line::~Line() {
    cout << "destroy";
}

int *Line::get() {
    return ptr;
}

int main() {
    Line line(10);
    cout << line.get() << "\t" << line.getLength() << "\t";
}
Line::Line(int len){
ptr=&len;

cout在构造函数的作用域内,*ptr确实包含值10,但在构造函数的作用域外,ptr的值未定义,并且取决于编译器。

&len
是指向局部参数
len
的指针,其作用域仅为构造函数的持续时间。构造函数返回后,
len
>已销毁,并且
&len
是一个悬空指针。稍后调用
getLength
时取消对它的引用是未定义的行为。
    Line::Line(int len) {
        ptr = &len;
        cout << *ptr << "\t";
        cout << ptr << "\t";
    }