0

这是代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    int *p = new int[2];
    p[0] = 1;
    p[1] = 2;
    cout << *p++ << endl;
    delete p;
    return 0;
}

它可以编译,但出现运行时错误“free(): invalid pointer”,然后是内存映射。

操作系统 ubuntu 10.10
编译器:g++ 4.4.3

4

3 回答 3

6

您需要调用数组版本delete

delete[] p;

编辑:但是,您真正的问题是您正在增加p.
运算符仅对分配的delete原始指针起作用。

于 2012-09-02T01:52:43.567 回答
3

您的调用delete必须使用与调用返回的相同的指针new

在您的代码中,您使用 递增p*p++由于运算符优先级被解释为*(p++)。因此,您提供delete了一个内存管理器从未听说过的指针。

此外,您应该使用delete[]来匹配对new[].

话虽如此,以下是您可能想要的猜测:

int *p = new int[2];
p[0] = 1;
p[1] = 2;
for(int i = 0; i < 2; i++)
    cout << p[i] << endl;
delete[] p;
return 0;
于 2012-09-02T02:24:10.383 回答
1

看代码:

int *p1 = new int;
int *p2 = new int[2];

int *p3 = p1;
int *p1 = p2;

delete p3;
delete[] p1;

指针p1p2具有相同的表示和相同的允许操作集。对于编译器,它们都是int*.

尽管他们指向的对象有很大的不同。来自new int[2]hegative offset 的对象有一个包含数组中项目数的标头。

使用数组对象与使用标量对象相同。只有当这个对象被释放时,才需要告诉编译器它是什么类型的对象。一个简单的对象或数组。这是已知的错误和混乱来源。尽管如此,语言在几十年前就是这样定义的,我们无法改变这一点。

delete与返回的指针完全相同也很重要new。此规则适用于 simplenewnew[].

于 2012-09-02T02:25:45.370 回答