一段C++代码出现错误"invalid pointer"

A piece of C++ code get "invalid pointer" error

本文关键字:invalid pointer 错误 C++ 代码 一段      更新时间:2023-10-16

这是代码:

#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((:无效指针",后跟一个内存映射。

操作系统 Ubuntu 10.10
编译器:G++ 4.4.3

你需要调用delete的数组版本:

delete[] p;

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

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;

查看代码:

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 偏移量的对象有一个标头,其中包含数组中的项数。

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

同样重要的是deletenew 返回的指针完全相同。此规则适用于简单newnew[]