簡體   English   中英

使用公共成員變量的地址訪問私有成員

[英]Using the address of a public member variable to access a private member

我創建了以下簡單的測試程序,以表明我可以使用公共整數的地址來訪問私有整數的值:

#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++14 5.7 Additive operators /4

出於這些運算符的目的,指向非數組對象的指針的行為與指向長度為1的數組的第一個元素的指針相同,該對象的類型為其元素類型。

/5在討論將整數值添加到指針時):

如果指針操作數和結果都指向同一數組對象的元素,或者指向數組對象的最后一個元素,則求值不會產生溢出; 否則,行為是不確定的。

在您的情況下,指針實際上指向“最后一個元素之后”,因此加法本身不會產生不確定的行為。

您可能認為取消引用該對象是未定義的,但是按照3.9.2 Compound types /3的注釋,它似乎是有效的:

例如,將認為數組末尾的地址(5.7)指向數組元素類型的不相關對象,該對象可能位於該地址。

但是,不管是否定義,取消引用仍然是不明智的,因為您實際上並不知道那里存在正確類型的變量。 實現可以根據需要隨意填充結構,因此無法保證price*(year + 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM