我是oop的初学者,这是我的问题
int main(){
int *p = new int[3];
p[0] = 1;
p[1] = 2;
p[2] = 3;
int* q = p;
p++; //here!
delete p;
}
和
int main(){
int *p = new int[3];
p[0] = 1;
p[1] = 2;
p[2] = 3;
int* q = p + 1;
p++; //here!
delete p;
}
有bug:没有分配被释放的指针 但 和
int main(){
int *p = new int[3];
p[0] = 1;
p[1] = 2;
p[2] = 3;
int* q = p + 1;
delete p;
}
好像很好!
我想删除此数组中的一个元素。有人能告诉我这个错误的原因吗?
答案 0 :(得分:5)
内存分配在连续的块中,必须以相同的方式返回。最好假设你的内存块带有一个小前缀,分配器用它来确定它的来源和大小。
此外,当你“新”一个数组时,你必须使用“delete []”来释放它。
thing* thingArray = new thing[64];
...
delete [] thingArray;
如果您尝试积极管理元素数组,则可能需要调查std::vector。
#include <vector>
std::vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
// v.size() is now 3 (num elements)
v.erase(v.begin()); // remove the first integer.
// v now "looks" like { 20, 30 }
// v.size() is now 2, not 3.
答案 1 :(得分:0)
delete
用于释放动态分配的内存(new
)。 delete
不用于删除元素。
该错误如下:首先,您在int *p = new int[3];
指针中的p
之后分配了内存,这是分配空间的内存地址。然后在p++
行中向此地址添加1,这意味着p
现在指向内存中的不同位置。然后您的delete
失败,因为您尝试在修改后的地址释放内存。