【问题标题】:Class function and member variable stomping memory类函数和成员变量踩内存
【发布时间】:2013-06-19 16:45:14
【问题描述】:

我正在开发适用于 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 类。抱歉,如果这非常含糊,但感谢所有帮助。提前致谢!

【问题讨论】:

  • 您能否在其中添加一个main 来说明问题或至少说明您是如何调用这些方法的
  • 您是否正确构建了所有依赖对象文件? IE。你能打破单一定义规则吗?您能否用实际代码进一步解释 “作为澄清,它会一直运行,直到它在 A 类的数组中初始化 B 类。” 的含义?
  • 这是真实的代码吗?为什么不使用构造函数(例如 B())来初始化成员变量“u32 StompedVariable;”到一个已知值?
  • A** arrayOfA = new A[10];那不应该是新的 A* [10]; ?以你的方式,你可能会遇到内存问题,因此为什么有时它会起作用,有时却不起作用。
  • @user2502064:您不会逐字发布专有代码,而是发布您在进行所有调试时使用的精简版testcase。如果您无法提供其中之一,那么我们将无法帮助您,更重要的是,您不太可能能够帮助自己。

标签: c++ class virtual


【解决方案1】:

鉴于您显示的代码,我唯一能想到的就是该行

A** arrayOfA = new A[10];

应该是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2013-02-08
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多