0

我目前正在使用 C++,我面临着这个挑战。这是头文件中我的类的代码:

class PID
{
   private:
   int PID;
   int total;

   public:
   PID(); // Constructor
   int returnPID(); // Returns PID.
};

这是cpp文件中的代码声明:

PID::PID()
{
    PID=INT_MAX;
    total=0;
}

int PID::returnPID()
{
    return PID;
}

这是包含指向类 PID 对象的指针的表的 main 中的声明和初始化:

PID* table[1000000];

for (int i=0; i<1000000; i++)
{
    table[i]=new PID;
}

所以我想这使用我在上面创建的构造函数将 PID 设置为 MAX_INT。当我尝试在初始化中使用 returnPID 访问 table[i].PID 的内容时,一切正常,如下所示:

for (int i=0; i<1000000; i++)
{
    table[i]=new PID;
    int display=table[i]->returnPID();
    cout<<display<<endl;
}

当我尝试在外部和初始化之后访问 table[i] 内容时,就会出现问题。我的主要崩溃并返回一个数字(-1073741571)作为错误。似乎连一个来自 main 的命令都没有执行。这是似乎重现问题的代码示例:

for (int i=0; i<1000000; i++)
{
    table[i]=new PID;
}
for (int i=0; i<1000000; i++)
{
    int display=table[i]->returnPID();
    cout<<display<<endl;
}

我已经为此工作了两个多小时,但没有找到任何解决方案,这似乎不合逻辑。有人对此有任何解释吗?

编辑:任何少于 1.000.000 个点的表都可以正常工作。也许它与此有关,尽管我仍然没有看到联系。

4

2 回答 2

3

有人对此有任何解释吗?

看来您的堆栈空间已用完。

您的编译器可以处理一百万个整数,而不是一百万个 PID* 吗?

任何点数少于 1.000.000 的表都可以正常工作。也许它与此有关,尽管我仍然没有看到联系。

它与此有关。

我试过这个:

int main(){
    int bec[10000000];
    for (int i=0; i<10000000;i++){
        bec[i] = i;
    }
    printf("%d\n",rand()%1000);
    return 0;

}

它的段错误与您的原因相同。

解决这个问题的唯一方法是使用更少的堆栈空间。您可以在 main 之外声明 bec 并且不为此使用堆栈空间,或者您可以使用 std::vector。你有很多选择。

于 2012-11-05T00:53:51.883 回答
0
PID* table[1000000];

有你的问题。这是一个自动分配的 1,000,000 个指针数组,或 [最多] 800 万字节。堆栈空间通常是相当有限的,而且您使用了很多。当我说“有限”时,我的意思是 8KB,而不是 8MB。

当你回顾这一点时,结果通常并不漂亮

8MB 对于自动分配来说已经很多了(你可以称之为“在堆栈上”);所以,考虑调整你的存储机制,或者考虑使用动态分配——一个 nice怎么样std::vector

顺便说一句..拥有一个与它所在的类同名的成员变量是愚蠢的。

于 2012-11-05T01:06:15.530 回答