删除C++中的时态数组

Deleting a temporal Array in C++

本文关键字:数组 C++ 删除      更新时间:2023-10-16

我正在处理我得到的一本书中的动态记忆。据我了解,每次我们创建一个变量时,我们都需要删除它,并将指针设置为 null,所以我们没有悬空指针

我创建了一个程序,将来自用户的值存储在 [5] 的动态数组中,每当用户添加更多值时,我都会"扩展"数组。扩展时,我使用了一个临时的新阵列,当我尝试删除它时,它会让我很难。为什么会这样?

size_t arraySize(5), index(0);
int inputvalue(0);
int *ptemporal(nullptr);
int *pvalues = new int[arraySize];
    for (;;){
        cout << "Enter value or 0 to end: ";
        cin >> inputvalue;  //enter value
        // exit loop if 0
        if (!inputvalue)  //if 0 break
            break;
        pvalues[index++] = inputvalue; //store values on pivalores
        if (index == arraySize){ //if limit reached create space
            cout << "Limit reached. Creating space...";
            arraySize += 5; //5 new memory blocks
            ptemporal = new int[arraySize]; //temporal value holder.
            for (size_t i = 0; i < arraySize - 5; i++)  //xfer values to temporal
                ptemporal[i] = pvalues[i];
                delete[] pvalues;       // delete values to  
                pvalues = ptemporal;  // assigning the same addres to pvalues.
                **delete[]  ptemporal; //causes a problem if I use the delete. if i comment the program works just fine.**
                ptemporal = nullptr;
        }

    }
return 0;
}

**两个星号只是为了表明问题是否发生。

您的问题是您将指针复制到pvalues后立即删除ptemporal

pvalues = ptemporal; // assigning the same addres to pvalues.
delete[]  ptemporal; //causes a problem if I use the delete. if i commentt the program works just fine.**

换句话说,您删除了刚刚创建的内存!因此,下次扩展向量时,会尝试再次删除它,从而导致双重释放错误。这种错误是调试器提供帮助的地方,因此您可以在程序执行时观察变量值。

// start
ptemporal = nullptr;
pvalues   = /* location A */;

// first expansion
ptemporal = /* location B */;
// copy values from location A to B
delete[]    pvales;    /* location A */
pvalues   = ptemporal; /* location B! */
delete[]    ptemporal; /* location B */
ptemporal = nullptr;

// second expansion
ptemporal = /* location C */;
// copy values from location B to C, should segfault
// then you delete pvalues (aka location B) again!
// this results in a double free error
delete[]    pvales;    /* location B */

要解决此问题,只需删除该行delete[] ptemporal;

你不需要

删除pTemporal。您已经删除了 pValues,并希望将 pTemporal 移交给它。

delete [] pValues;
pValues = pTemporal;
pTemporal = NULL;