C++ 为什么指针未被复制时会出现错误?

C++ 为什么指针未被复制时会出现错误?,c++,c++11,C++,C++11,下面的代码抛出一个错误。错误出现在delete[]pIntArray上。错误为_ASSERTE(_BLOCK_TYPE_is VALID(pHead->nBlockUse));: #包括 使用std::cout; 使用std::endl; int main() { int*pIntArray=新int[50]; coutfor(int i=0;i

下面的代码抛出一个错误。错误出现在delete[]pIntArray上。错误为_ASSERTE(_BLOCK_TYPE_is VALID(pHead->nBlockUse));:

#包括
使用std::cout;
使用std::endl;
int main()
{
int*pIntArray=新int[50];
cout
for(int i=0;i<50;++i)
{

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

例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字处的内存大小)

delete[]
的指针必须与从
new[]获得的相同指针相匹配
。在本例中,您在这两者之间增加了它。这适用于常规的
新建
/
删除
malloc
/
免费
。您的第二个示例是正确的。我倾向于这样做,这就是原因,但有两个简单的问题:1.这只是关于从新建返回的指针。2.因此,如果您是g若要更改new返回的指针的地址,是否需要始终先缓存它以便正确删除?是否需要始终先缓存它?我不这样认为,但是,如果像此问题中那样将指针用作数组,则可能必须将指针解引用到其初始值。否则,如果将指针用作pointer而不是数组,则指针指向的当前元素将被删除以避免内存泄漏。每当您使用指针指向另一个新值时,该指针指向的旧值及其内存位置将不再存在,因为您已释放了该内存位置。
for (int i = 0; i < 50; ++i)
{
    cout << "integer[" << i << "] = " << *(pIntArray++) << endl;

}

cout << "deleting dynamic memory ..." << endl;

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