一段C++代码出现错误"invalid pointer"
A piece of C++ code get "invalid pointer" error
这是代码:
#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;
指针p1
和p2
具有相同的表示形式和相同的允许操作集。对于编译器,它们都是int*
.
尽管它们所指向的对象明显不同。来自 new int[2]
的 hegative 偏移量的对象有一个标头,其中包含数组中的项数。
使用数组对象与使用标量对象相同。只有当这个对象被释放时,才需要告诉编译器它是什么样的对象。一个简单的对象或数组。这是已知的错误和混乱来源。无论如何,几十年前语言就是这样定义的,我们无法改变这一点。
同样重要的是delete
与 new
返回的指针完全相同。此规则适用于简单new
和new[]
。
相关文章:
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++ "error: invalid use of void expression"
- 收到错误"invalid use of non-static data member 'stu::n' "
- Poloniex API "Invalid command" c++ libcurl
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- "No-Const Pointer to Const "调用功能
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 如何捕捉"free(): invalid pointer:"
- 如何修复合并两个C++数组时'Invalid Pointer'
- " free(): invalid pointer:" 8谜题BFS
- 在析构函数中检测到"Trying to free invalid pointer"错误
- 一段C++代码出现错误"invalid pointer"
- 文本输出() - "invalid null pointer"
- 将shared_ptr(this)推入矢量会导致"free(): invalid pointer"错误
- 为什么我会收到"./exe: free(): Invalid Pointer"错误?
- "Invalid pointer dequeued from free list",断点malloc_error_break无济于事
- "glibc detected - free(): invalid pointer - Program received signal SIGABRT, Aborted"