c++ - 类函数和成员变量踩内存

标签 c++ class virtual

我正在开发适用于 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 时,它会随机给出一个铺位号。它可能会工作 2 次,然后它会返回一个错误的数字(显然是从内存中的错误位置获取的)。该功能是否为虚拟并不重要,但它是理想的解决方案。最糟糕的是,它在 iOS 版本上编译和运行良好,但在 Android 上就死机了。正如一个澄清,它会一直运行,直到它初始化 A 类数组中的 B 类。抱歉,如果这很含糊,但我们将不胜感激。提前致谢!

最佳答案

鉴于您显示的代码,我唯一能想到的就是这条线

A** arrayOfA = new A[10];

应该是

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

您描述的症状似乎表明您正在执行某种内存违规,并且将指向 A 的指针的指针数组视为 A 的数组,然后稍后通过将 D 分配给它们来访问这些 A,可能会导致那个。它可能在添加成员变量之前工作正常,因为之前它只是一个空结构(地址的大小)。现在 sizeof(A) != sizeof(A*),你正在遍历你的内存.

关于c++ - 类函数和成员变量踩内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17196834/

相关文章:

java - secret 可以隐藏在提供访问凭证的 'safe' java 类中吗?

windows - 为什么 Windows 为其系统地址空间保留 1Gb(或 2 Gb)?

命名空间的 C++ 继承问题

c++ - 为什么 valgrind "valid value"需要 8 位?

c++ - 返回类内结构

c++ - lodePNG 内存分配错误

c++ - 重载的赋值运算符不起作用

gradle - Javafx应用程序的Gradle构建:由于缺少系统属性,虚拟键盘无法正常工作

c++ - 在多个线程中重写方法

c++ - 运行 PTK 测试