【问题标题】:Array with pointers to objects initialization带有指向对象初始化的指针的数组
【发布时间】:2012-11-05 00:40:13
【问题描述】:

我目前正在使用 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 的表格都可以正常工作。也许这与此有关,尽管我仍然没有看到联系。

【问题讨论】:

  • “我的 main 无缘无故崩溃了” - 值得怀疑。我倾向于相信操作系统。
  • 这对我来说是一个糟糕的陈述。必须有一个原因,实际上这就是我正在寻找的原因。有什么想法吗?
  • error: field ‘int PID::PID’ with same name as class...避免它....
  • @noleptr 约定使用类的名称作为类构造函数和析构函数。你是第一个告诉我这种事情的人。关于为什么我应该避免这种情况的任何提示?
  • @Aposperite....我说的是 PID private 变量....顺便说一句,这是我的 gcc 编译器...我试图看看你的代码有什么问题....

标签: c++ arrays class pointers


【解决方案1】:

有人对此有什么解释吗?

您的堆栈空间似乎用完了。

您的编译器能否处理一百万个整数,而不是一百万个 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。你有很多选择。

【讨论】:

  • 你是对的,我可以确认我得到了同样的错误。所以这意味着这是一个编译器错误?
  • 不,这是你的错误。您可以在 main 之外声明 bec 并且不使用堆栈空间,或者您可以使用 std::vector。你有很多选择。
  • 非常感谢您的指导。我一开始从没想过堆栈大小。再次感谢你。如果您可以将此评论添加到功能查看器的主要答案中,我将接受您的答案。再次感谢您。
【解决方案2】:
PID* table[1000000];

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

当您查看此内容时,通常会显示结果are not pretty

8MB 是一个 lot 用于自动分配(您可以称之为“在堆栈上”);所以,考虑调整你的存储机制,或者考虑使用动态分配——一个漂亮的std::vector怎么样?

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

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 2013-06-30
    • 2010-10-11
    • 1970-01-01
    • 2015-04-28
    • 2015-12-31
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多