为什么指针未复制时会出现错误

Why do I get an error when the pointer is not copied?

本文关键字:错误 指针 复制 为什么      更新时间:2023-10-16

以下代码引发一个错误。错误在delete[]pIntArray处,错误为_ASSERTE(_BLOCK_TYPE_is_VALID(pHead->nBlockUse((;:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    int* pIntArray = new int[50];
    cout << "adding numbers to array ..." << endl;
    for (int i = 0; i < 50; i++)
    {
        pIntArray[i] = i + 10;
    }
    cout << "values in array: " << endl;
    for (int i = 0; i < 50; ++i)
    {
        cout << "integer[" << i << "] = " << *(pIntArray++) << endl;
    }
    cout << "deleting dynamic memory ..." << endl;
    delete[] pIntArray;
    cout << "memory deleted." << endl;
    return 0;
}

但事实并非如此。唯一的区别是我正在复制指针并递增副本:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    int* pIntArray = new int[50];
    cout << "adding numbers to array ..." << endl;
    int* pCopy = pIntArray;
    for (int i = 0; i < 50; i++)
    {
        pIntArray[i] = i + 10;
    }
    cout << "values in array: " << endl;
    for (int i = 0; i < 50; ++i)
    {
        cout << "integer[" << i << "] = " << *(pCopy++) << endl;
    }
    cout << "deleting dynamic memory ..." << endl;
    delete[] pIntArray;
    cout << "memory deleted." << endl;
    return 0;
}

有人能解释一下原因吗?提前谢谢。

因为您正在更改指针的值,指针指向的内存地址:

示例1:

[0][0][0][0][0][0][0][0][0][0][0][0]
                                  ^
                                  |
                                  pIntArray is here

示例2:

[0][0][0][0][0][0][0][0][0][0][0][0]
 ^                                ^
 |                                |
 pIntArray is here                pCopy is here

您需要delete[]精确的指针(这是因为大多数C/C++运行时存储分配在ptr - 1 word的内存大小(

for (int i = 0; i < 50; ++i)
{
    cout << "integer[" << i << "] = " << *(pIntArray++) << endl;
}
cout << "deleting dynamic memory ..." << endl;
delete[] pIntArray;

使用++修改pIntArray的值,然后将修改后的值传递给delete[]。您需要将new[]返回的值精确地传递给delete[]