【发布时间】:2023-04-08 17:04:01
【问题描述】:
我创建了以下简单的测试程序来证明我可以使用公共整数的地址来访问私有整数的值:
#include <iostream>
using namespace std;
class CarType{
public:
int year;
CarType(int price, int year){this -> year = year; this -> price = price;};
private:
int price;
};
int main(){
//Create new CarType object
CarType a = CarType(15000, 1999);
//Increment the memory address of public member variable, year by 1 and save the result
int* pricePointer = &a.year+1;
//De-reference the memory address and output it
cout << "PRICE: "<< *pricePointer << endl;
return 0;
}
输出显示我可以通过知道年份的地址来访问价格变量。有没有办法防止这种情况发生?这只是一种边缘情况还是适用于所有类型的对象?
【问题讨论】:
-
C++ 不会阻止有人朝自己的脚开枪。
-
没有没有保证你正在做的事情总是有效的。本质上,在这种情况下,编译器以这样一种方式布置内存,即变量
price被放置在“紧随”year之后。但是因为您使用的是类而不是 POD,并且编译器确实向对象“添加了东西”,所以不能保证内存总是以这种方式布局。尝试添加其他成员变量和方法,看看会发生什么。有关详细信息,请参阅 Stephen C. Dewhurst 的 C++ Common Knowledge 的第 11 条。其他更熟悉编译器设计的人可能能够提供更多详细信息。
标签: c++ pointers memory-management