【发布时间】:2016-10-20 11:19:24
【问题描述】:
好的,我将列出两个程序。两者都是使用指针和 new 运算符的动态数组。但似乎不喜欢删除运算符。
#include <iostream>
int main()
{
int *p;
p = new int[5];
for (int i = 0; i < 5; i++)
{
p[i] = 25 + (i * 10);
std::cout << p[i] << " ";
}
std::cout << std::endl;
delete [] p;
p = NULL;
return 0;
}
这是第一个程序。它喜欢删除操作符就好了。现在不喜欢删除操作符的程序:
#include <iostream>
int main()
{
int x;
int *p;
p = new int[5];
*p = 4;
for (int i = 0; i < 5; i++)
{
std::cout << *p << " ";
x = *p;
p++;
*p = x + 1;
}
std::cout << std::endl;
delete [] p;
p = NULL;
return 0;
}
这个程序编译得很好。但是在执行过程中,它会抛出一个错误 - free(): invalid pointer: 0xfdb038 .. 或任何用于该特定执行的内存地址。所以,问题是:
为什么第二种情况不能使用delete操作符?
我不想有内存泄漏;我不希望指针悬空。
如果我只是说p = NULL;,那么p = 0,但我相信指针仍然悬空?,但我不确定。提前致谢。
【问题讨论】:
-
因为在第二种情况下,您更改了
p指针并且它没有指向删除之前开始的数组。
标签: c++ pointers dynamic-arrays delete-operator