【问题标题】:XCode: Stack Size Limit on Multidimensional ArrayXCode:多维数组的堆栈大小限制
【发布时间】:2016-06-27 23:51:51
【问题描述】:

我的 xcode 项目中有一些复杂的类(下面是一个通用示例) 看来我已经达到了某种数据大小限制。 我需要的数组大小不起作用,如果我减小数组大小代码可以工作(所以没有编程错误),但它对于我的计划来说太小了。

通过互联网阅读我发现这一定是堆栈大小的问题,并且大多数解决方案都说“将您的静态数组转换为动态数组”。

但是 (1) 使用多维数组并不那么容易(有些多达 5 到 10 维,因为它们监控多个自变量并且每种组合都是可能的) 和 (2) 是大多数数组嵌套在几个类中,使情况更糟。

我已经考虑过减少数据

  • int 而不是 long 与一些智能换位...
  • 将 c (0-100%) 的分辨率更改为 10% 的步长(因此 [100] 减少到 [10])

但一方面这可能会危及整体结果,另一方面该项目仍处于起步阶段,因此它将在下个月增长......这个数组大小问题迟早会回来......

在这里,我概括了显示 4 维数组 (2x 2D) 的代码。 我猜大多数专业程序使用更大的数组。 所以必须有办法让它工作......

//.h
class StatisticTable
{
public:
    long Array1 [100][50];
    long Array2 [100][50];
    long Array3 [100][140];
};

class Statistic
{
public:
    void WriteStatistic(short Parameter_a, short Parameter_b,
                        short Parameter_c, short Parameter_d);
    short ReadStatistic(short Parameter_a, short Parameter_b,
                        short Parameter_c, short Parameter_d);

private:
    StatisticTable Table[16][8];
};

//.cpp
void WriteStatistic(short a, short b, short c, short d)
{
    for (int i=0; i<d,   i++) {Table[a][b].Array1[c][i]++;}
    for (int i=d; i<50,  i++) {Table[a][b].Array2[c][i]++;}

    //write some more stuff

    return;
}

【问题讨论】:

    标签: c++ xcode multidimensional-array stack-size


    【解决方案1】:

    你能用堆分配代替堆栈分配吗?

    按照建议,使用 std::unique_ptr:

    auto const ptr = std::unique_ptr<StatisticTable>(new StatisticTable()).get(); // heap allocated and deleted automatically when obj goes out of scope
    

    auto obj = new StatisticTable(); // heap allocation, allocate reference to new StatisticTable object on heap
    // code
    delete obj; // release heap allocated object
    

    对比

    auto x = StatisticTable() // stack allocation
    

    【讨论】:

    • "auto x = new *StatisticTable();"和“删除 &new;”两者都得到“错误,需要一个类型”...“auto x = *new StatisticTable();”被 xcode 编译器接受(并触发正确的子函数)但“删除 &x;”得到“错误,被释放的指针没有被分配”
    • 这对我有用:class MyClass { }; int main(int argc, const char * argv[]) { auto obj = *new MyClass(); delete &amp;obj ; }
    • 应该是delete &amp;x; 而不是delete &amp;new
    • 也许毕竟不是分配问题。但无论如何,您必须使用new/delete 从堆中分配大对象。您可能正在写超出数组边界的末尾。在 Xcode 中,您应该打开地址清理。 (查看 Scheme 设置,Diagnostics 选项卡,选中“Enable Address Sanitizer”)
    • 您的 MyClass 示例现在看起来与我在上面更正您的代码的方式完全相同(“*new”而不是“*MyClass”和“&obj”而不是“&new”)...但我在“&obj”说“指针未分配”......如果我增加 MyClass 中的数组,我会遇到与以前相同的错误
    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 2023-04-10
    • 2018-02-08
    • 2018-10-16
    • 2022-07-21
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多