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