c++中的一个指针问题
class A
{
public:
A(int num);
int* p;
};
#include "A.h"
#include<iostream>
using namespace std;
A::A(int num):p(&num) {
cout << *p << endl;
}
#include "A.h"
#include<iostream>
using namespace std;
int main() {
A a1(10);
cout << a1.p <<" "<< *a1.p<<endl;
return 0;
}
构造函数中输出p所指的东西,main函数中再输出a1中p所指的东西,两个值不同
10
0000000FC2FAFCC8 -1023738680
p(&num)
这个不行,你去取堆栈上的地址是没有意义的,出了构造函数,这个地址无效了。
我今天看到了一个全网最详细的指针讲解博客,希望对你有帮助,推荐给你:
不知道你这个问题是否已经解决, 如果还没有解决的话:问题的原因在于构造函数中的指针p指向了一个局部变量num,这个局部变量在构造函数执行完毕后就会被销毁,因此在main函数中再次访问指针p时会导致未定义的行为。
为了修正这个问题,可以将指针p指向动态分配的内存,而不是局部变量。具体步骤如下:
new
操作符动态分配内存来存储整数,并将指针p指向该内存。delete
操作符释放p指针所指向的内存。以下是修正后的代码:
class A
{
public:
A(int num);
~A();
int* p;
};
#include "A.h"
#include <iostream>
using namespace std;
A::A(int num) {
p = new int(num);
cout << *p << endl;
}
A::~A() {
delete p;
}
#include "A.h"
#include <iostream>
using namespace std;
int main() {
A a1(10);
cout << a1.p << " " << *a1.p << endl;
return 0;
}
运行修正后的代码,输出结果为:
10
000002154F242B20 10
修正后,两次输出的值相同且正确。