4

我是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;
}

有错误:被释放的指针没有被分配,但是和

int main(){
        int *p = new int[3];
        p[0] = 1;
        p[1] = 2;
        p[2] = 3;
        int* q = p + 1;
        delete p;
}

看起来不错!我想删除这个数组中的一个元素。有人能告诉我这个错误的原因吗?

4

2 回答 2

8

内存分配在连续的块中,并且必须以相同的方式返回。最好假设您的内存块带有一个小的前缀,分配器使用该前缀来确定它的来源和大小。

另外,当你“新建”一个数组时,你必须使用“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.
于 2013-10-25T16:21:56.093 回答
0

delete用于释放动态分配的内存(按new)。delete不用于删除元素。错误如下:首先你分配了内存,所以int *p = new int[3];p指针之后是分配空间的内存地址。然后在该行的这个地址上加 1 p++,这意味着它p现在指向内存中的不同位置。然后你delete失败了,因为你试图在修改后的地址释放内存。

于 2013-10-25T16:24:35.347 回答