我对C ++很陌生。完成循环后,我必须删除指针和内存分配。我使用new()
进行内存分配,最后使用delete
来释放数据。
该计划如下:
int main()
{
float *ptr;
ptr = new float[16];
for(int i=0; i<16; i++)
{
ptr[i] = 10.0f+i;
cout << i << " " << ptr[i] << endl;
}
delete[] ptr;
cout << ptr[2] << endl; **// I STILL HAVE THE VALUE AT THIS ADDRESS. AFTER DELETING**
}
return 0;
}
为什么数据在删除后仍然存在于内存中。
答案 0 :(得分:4)
这是未定义的行为。删除后,您正在访问内存。
因为删除内存块并不会将指向它的所有指针的值归零。删除内存只是说明内存可用于某些其他目的。在此之前,记忆可能看起来完好无损 - 但你不能指望它。在某些编译器/运行时/体系结构组合中,您的程序将表现不同。
调用delete[]
时会发生两件事:
在调用delete
之后访问数组占用的内存会导致未定义的行为(即,可能发生任何事情 - 数据可能仍然存在,或者当您尝试读取时,程序可能会崩溃,或者可能会发生更糟糕的事情。)
使用RAII。要么将它包装在一个类中,要么使用STL并且不要自己管理内存。 C ++是强大的,但你也可以把你的腿吹走 - 可以这么说。更好的做法是将其置于自己的范围内,以防止超出范围的任何内容访问指针。
{
Foo* pFoo = new Foo;
// use pFoo
delete pFoo;
}
// anything using pFoo beyond here fails at compilation