簡體   English   中英

類函數和成員變量踩踏內存

[英]Class function and member variable stomping memory

我正在開發適用於iOS和Android的應用程序,而我的C ++代碼獲得了截然不同的結果。 我遇到的問題是,輸入函數踩踏成員變量是派生類。 舉個例子

int main()
{
   A** arrayOfA = new A[10];
   for (int i = 0; i < 10; ++i)
   {
      arrayOfA[i] = new D();
   }

   return 0;
};
class A
{

// Original code here. After this is the added function and member variable that breaks it

public:
   virtual u32 GetterFunction() = 0;

protected:
   u32 ProblemVariable;
};

class B : A
{
public:
   B(u32 index) { ProblemVariable = index }
   virtual u32 StompedGetter() = 0;
   virtual u32 GetterFunction() { return ProblemVariable; }

   void Initialize()
   {
      u32 sometimesBunkNumber = StompedGetter();
   }

protected:
   u32 StompedVariable;
};

class C : A
{
public:
   virtual u32 GetterFunction() { return 0; }
};

class D : B
{
   B() { Initialize(); }
   virtual StompedGetter() { return StompedVariable; }
}

class E : B
{
   virtual StompedGetter() { return 0; }
}

現在,這里的問題是,直到我將成員變量和虛擬getter放入類A為止,一切都可以正常工作。當調用getter時,它會在隨機時間給出一個下鋪號。 它可能會工作兩次,然后返回一個錯誤的數字(顯然是從內存中的錯誤位置抓取的)。 函數是否為虛擬函數無關緊要,但這是理想的解決方案。 最糟糕的是,它可以在iOS版本上編譯並運行良好,但在Android上卻死了。 就像澄清一樣,它一直運行到在類A的數組中初始化類B為止。很抱歉,如果這很含糊,不勝感激。 提前致謝!

鑒於您所顯示的代碼,我唯一能想到的就是該行

A** arrayOfA = new A[10];

相反應該是

A** arrayOfA = new A*[10];

您描述的症狀似乎表明您正在執行某種內存沖突,並且將指向A的指針的數組視為A的數組,然后稍后通過為它們分配D來訪問這些A。 在添加成員變量之前,它可能工作得很好,因為之前它只是一個空結構(地址的大小。)現在,sizeof(A)!= sizeof(A *),您將遍歷整個內存。

暫無
暫無

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

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