【问题标题】:Program crashes on deleting array of pointers in struct程序在删除结构中的指针数组时崩溃
【发布时间】:2012-09-19 21:55:49
【问题描述】:

删除命令出现时崩溃。它应该用指向数组的指针创建一个结构,用随机数填充它们,然后释放内存。工作正常,直到删除命令,它在没有 for 循环或布尔检查的情况下崩溃。

int main() {

    cout << "start" << endl;
    //Creating Struct
    struct 
    {
        int* ptrarray[10];
        bool boolarray[10];
    } data;

    //Initializing Random Generator
    srand ( time(NULL) );
    cout << "Initializing: ";

    //Allocating Memory and generating random numbers with for loops

    for (int i = 0; i < 10; i++)
    {   
        int counter = 0; //Counts numbers set   
        cout <<  i << " "; //Counting arrays initialized    
        data.ptrarray[i] = new int [12582912]; // Memory Allocation 

        for (int j = 0; j < 12582912; j++)//Number Generating
        {
            *data.ptrarray[i] = rand() % 899 + 100;
            data.ptrarray[i]++;
            counter++;
        }

        //Checking for failed initializations and declaring if success
        if (counter == 12582912)
        {
            data.boolarray[i] = true;
        }
        else
        {
            data.boolarray[i] = false;
        }
    }

    cout << endl;

    //This is where it always crashes.
    for (int i=0; i<10; i++)
    {
        if (data.boolarray[i] == true)
            delete[] data.ptrarray[i];
    }
    cout << endl;

    return 0;
}

我正在使用 MS Visual Studio 2010。

【问题讨论】:

  • 这种格式很糟糕。请重新格式化并粘贴要点。

标签: c++ delete-operator


【解决方案1】:

罪魁祸首是这一行:

data.ptrarray[i]++;

您正在更改指针,然后在修改后的指针上使用delete []。这不起作用:您必须使用 delete[] 和从 new[] 获得的完全相同的指针。

试试

data.ptrarray[i][j] = rand() % 899 + 100;

这样您就不必更改指针。

【讨论】:

  • 尽管它有点慢。除非编译器将其优化掉。
  • 大多数现代编译器都足够聪明,可以识别数组填充循环for(x=0; x&lt;n; x++) arr[x] = f(x);,并将创建一个适当的临时变量。
  • 非常感谢(感谢所有看到错误的人)。现在很有意义。
  • 好吧,好吧。现在删除很好。 (我删除了 data.ptrarray[i]++; 并将 *data.ptrarray[i] = rand() % 899 + 100; 替换为 data.ptrarray[i][j] = rand() % 899 + 100;)但是现在它不会打印正确的整数范围,而是一些百搭数字(负数,0,超过 1000)。有什么想法吗?
  • 好吧,算了,我还必须更改扩展代码中的打印功能。再次感谢。
【解决方案2】:

data.ptrarray[i]++; 是问题所在。

您正在增加对数据的引用,但在尝试删除它之前没有将其重置为开始。

【讨论】:

    【解决方案3】:

    你的问题在于:

    data.ptrarray[i]++;
    

    这是修改指针。然后,当您尝试释放修改后的指针时,它会崩溃。

    您可以通过使用指针的副本遍历数组来解决此问题,或者也可以使用j 变量进行索引:

    data.ptrarray[i][j]
    

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 2012-03-13
      • 2014-07-16
      • 1970-01-01
      • 2018-11-01
      • 2018-02-22
      • 1970-01-01
      • 2014-03-15
      • 2021-12-25
      相关资源
      最近更新 更多