munmap_chunk(): 在 C++ 中创建数组数据结构时出现无效指针错误
munmap_chunk(): invalid pointer Error while making an Array data structure in C++
我尝试过许多关于 munmap_chunk(): invalid pointer
错误的类似问题,但我不知道该怎么做。我也尝试添加 free
命令。
我是 C++ 新手,通常使用 Python 和 Java,所以指针和内存管理的整个概念对我来说都是新的。如果有人能解释我做错了什么,那就太好了。
这是我的数组 class 的通用 T 代码:
#include <iostream>
using namespace std;
template <typename T>
class Array {
private:
T *arr;
int len = 0; //length the user thinks the array is
int capacity = 0; //actual array capacity
public:
Array(int cap=16){
if (cap<0){
throw invalid_argument("Illegal Capacity: "+cap);
}
capacity = cap;
arr = new T[cap];
for(int i=0; i<capacity; i++){
arr[i] = 0;
}
}
~Array(){ delete [] arr; }
T& operator[](int index){ return arr[index]; }
int size(){ return len; }
bool isEmpty(){ return size() == 0; }
T get(int index){ return arr[index]; }
void set(int index, T elem){ arr[index] = elem; }
void clear(){
for(int i = 0; i < capacity; i++)
arr[i] = 0;
len = 0;
}
void add(T elem){
if (len+1 > capacity){
if (capacity == 0) capacity = 1;
else capacity*=2;
T *newarr = new T[capacity];
for (int i = 0; i < len; i++){
newarr[i] = arr[i];
}
delete [] arr;
arr = newarr;
}
arr[len++]=elem;
}
T removeAt(int rmIndex){
if (rmIndex >= len || rmIndex < 0) throw out_of_range(rmIndex +" out of range for len " + len);
T data = arr[rmIndex];
T *newarr = new T[len-1];
for (int i=0, j=0; i < len; i++, j++){
if (i==rmIndex){
j--;
}
else{
newarr[j]=arr[i];
}
}
delete [] arr;
arr = newarr;
capacity = --len;
return data;
}
bool remove(T t){
for (int i=0; i<len; i++){
if (arr[i]==t){
removeAt(i);
return true;
}
}
return false;
}
int indexOf(T t){
for (int i=0; i<len; i++){
if (arr[i]==t){
return i;
}
}
return -1;
}
bool contains(T t){ return indexOf(t) != -1; }
};
int main()
{
cout << "hello" <<endl;
Array<float>z(122);
cout << z.size() << endl;
for (int i = 0; i < z.size(); i++){
z.set(i,(float)i);
}
for (int i = 0; i < z.size(); i++){
cout << z.get(i);
}
cout << z.size() << endl;
return 0;
}
输出只有hello world
,没有其他任何东西。
我一直在向 this video 学习,我正在尝试将那里给出的 Java 代码转换为 C++ 以尝试学习该语言,并且我一直在为此广泛使用 Whosebug .不过对于这个问题,我找不到问题的根源,所以请帮助我。
尝试将其改编成 C++ 的 Java 代码可用 here。
感谢@S.M。 @anastaciu 和@jkb 的指导。
这里贴出的原代码是:
#include <iostream>
using namespace std;
template <typename T>
class Array {
private:
T *arr;
int len = 0;
int capacity = 0;
public:
Array(int cap = 16) {
if (cap < 0) {
throw invalid_argument("Illegal Capacity: " + cap);
}
capacity = cap;
arr = new T[cap];
for (int i = 0; i < capacity; i++) {
arr[i] = 0;
}
}
~Array() { delete arr; }
T &operator[](int index) { return arr[index]; }
int size() { return len; }
bool isEmpty() { return size() == 0; }
T get(int index) { return arr[index]; }
void set(int index, T elem) { arr[index] = elem; }
void clear() {
for (int i = 0; i < capacity; i++) arr[i] = 0;
len = 0;
}
void add(T elem) {
if (len + 1 > capacity) {
if (capacity == 0)
capacity = 1;
else
capacity *= 2;
T *newarr = new T[capacity];
for (int i = 0; i < len; i++) {
newarr[i] = arr[i];
}
free(arr);
arr = newarr;
}
arr[len++] = elem;
}
T removeAt(int rmIndex) {
if (rmIndex >= len || rmIndex < 0)
throw out_of_range(rmIndex + " out of range for len " + len);
T data = arr[rmIndex];
T *newarr = new T[len - 1];
for (int i = 0, j = 0; i < len; i++, j++) {
if (i == rmIndex) {
j--;
} else {
newarr[j] = arr[i];
}
}
free(arr);
arr = newarr;
capacity = --len;
return data;
}
bool remove(T t) {
for (int i = 0; i < len; i++) {
if (arr[i] == t) {
removeAt(i);
return true;
}
}
return false;
}
int indexOf(T t) {
for (int i = 0; i < len; i++) {
if (arr[i] == t) {
return i;
}
}
return -1;
}
bool contains(T t) { return indexOf(t) != -1; }
};
int main() {
Array<float> z(122);
for (int i = 0; i < z.size(); i++) {
z.set(i, (float)i);
std::cout << z[i];
}
return 0;
}
只要使用new []
,就需要搭配一个delete []
。不应使用 free
和 delete
。这是这里的第一个问题,但这不是导致代码无法运行的原因。
主代码从不初始化 len
,因此当使用 size()
函数时,它 returns 0
,因此 for loop
永远不会已进入。
每次 set
也需要更新 len
。
因此,主要问题在于逻辑本身。
size()
函数取决于正在设置的 len
成员,但它没有。
您还应注意表达式 "Illegal Capacity: " + cap
不会将 cap
的值附加到字符串的末尾。它进行指针运算,如果 cap
小于零,您将在字符串文字开头 之前使用指向内存的指针构造异常。
我尝试过许多关于 munmap_chunk(): invalid pointer
错误的类似问题,但我不知道该怎么做。我也尝试添加 free
命令。
我是 C++ 新手,通常使用 Python 和 Java,所以指针和内存管理的整个概念对我来说都是新的。如果有人能解释我做错了什么,那就太好了。
这是我的数组 class 的通用 T 代码:
#include <iostream>
using namespace std;
template <typename T>
class Array {
private:
T *arr;
int len = 0; //length the user thinks the array is
int capacity = 0; //actual array capacity
public:
Array(int cap=16){
if (cap<0){
throw invalid_argument("Illegal Capacity: "+cap);
}
capacity = cap;
arr = new T[cap];
for(int i=0; i<capacity; i++){
arr[i] = 0;
}
}
~Array(){ delete [] arr; }
T& operator[](int index){ return arr[index]; }
int size(){ return len; }
bool isEmpty(){ return size() == 0; }
T get(int index){ return arr[index]; }
void set(int index, T elem){ arr[index] = elem; }
void clear(){
for(int i = 0; i < capacity; i++)
arr[i] = 0;
len = 0;
}
void add(T elem){
if (len+1 > capacity){
if (capacity == 0) capacity = 1;
else capacity*=2;
T *newarr = new T[capacity];
for (int i = 0; i < len; i++){
newarr[i] = arr[i];
}
delete [] arr;
arr = newarr;
}
arr[len++]=elem;
}
T removeAt(int rmIndex){
if (rmIndex >= len || rmIndex < 0) throw out_of_range(rmIndex +" out of range for len " + len);
T data = arr[rmIndex];
T *newarr = new T[len-1];
for (int i=0, j=0; i < len; i++, j++){
if (i==rmIndex){
j--;
}
else{
newarr[j]=arr[i];
}
}
delete [] arr;
arr = newarr;
capacity = --len;
return data;
}
bool remove(T t){
for (int i=0; i<len; i++){
if (arr[i]==t){
removeAt(i);
return true;
}
}
return false;
}
int indexOf(T t){
for (int i=0; i<len; i++){
if (arr[i]==t){
return i;
}
}
return -1;
}
bool contains(T t){ return indexOf(t) != -1; }
};
int main()
{
cout << "hello" <<endl;
Array<float>z(122);
cout << z.size() << endl;
for (int i = 0; i < z.size(); i++){
z.set(i,(float)i);
}
for (int i = 0; i < z.size(); i++){
cout << z.get(i);
}
cout << z.size() << endl;
return 0;
}
输出只有hello world
,没有其他任何东西。
我一直在向 this video 学习,我正在尝试将那里给出的 Java 代码转换为 C++ 以尝试学习该语言,并且我一直在为此广泛使用 Whosebug .不过对于这个问题,我找不到问题的根源,所以请帮助我。
尝试将其改编成 C++ 的 Java 代码可用 here。
感谢@S.M。 @anastaciu 和@jkb 的指导。
这里贴出的原代码是:
#include <iostream>
using namespace std;
template <typename T>
class Array {
private:
T *arr;
int len = 0;
int capacity = 0;
public:
Array(int cap = 16) {
if (cap < 0) {
throw invalid_argument("Illegal Capacity: " + cap);
}
capacity = cap;
arr = new T[cap];
for (int i = 0; i < capacity; i++) {
arr[i] = 0;
}
}
~Array() { delete arr; }
T &operator[](int index) { return arr[index]; }
int size() { return len; }
bool isEmpty() { return size() == 0; }
T get(int index) { return arr[index]; }
void set(int index, T elem) { arr[index] = elem; }
void clear() {
for (int i = 0; i < capacity; i++) arr[i] = 0;
len = 0;
}
void add(T elem) {
if (len + 1 > capacity) {
if (capacity == 0)
capacity = 1;
else
capacity *= 2;
T *newarr = new T[capacity];
for (int i = 0; i < len; i++) {
newarr[i] = arr[i];
}
free(arr);
arr = newarr;
}
arr[len++] = elem;
}
T removeAt(int rmIndex) {
if (rmIndex >= len || rmIndex < 0)
throw out_of_range(rmIndex + " out of range for len " + len);
T data = arr[rmIndex];
T *newarr = new T[len - 1];
for (int i = 0, j = 0; i < len; i++, j++) {
if (i == rmIndex) {
j--;
} else {
newarr[j] = arr[i];
}
}
free(arr);
arr = newarr;
capacity = --len;
return data;
}
bool remove(T t) {
for (int i = 0; i < len; i++) {
if (arr[i] == t) {
removeAt(i);
return true;
}
}
return false;
}
int indexOf(T t) {
for (int i = 0; i < len; i++) {
if (arr[i] == t) {
return i;
}
}
return -1;
}
bool contains(T t) { return indexOf(t) != -1; }
};
int main() {
Array<float> z(122);
for (int i = 0; i < z.size(); i++) {
z.set(i, (float)i);
std::cout << z[i];
}
return 0;
}
只要使用new []
,就需要搭配一个delete []
。不应使用 free
和 delete
。这是这里的第一个问题,但这不是导致代码无法运行的原因。
主代码从不初始化 len
,因此当使用 size()
函数时,它 returns 0
,因此 for loop
永远不会已进入。
每次 set
也需要更新 len
。
因此,主要问题在于逻辑本身。
size()
函数取决于正在设置的 len
成员,但它没有。
您还应注意表达式 "Illegal Capacity: " + cap
不会将 cap
的值附加到字符串的末尾。它进行指针运算,如果 cap
小于零,您将在字符串文字开头 之前使用指向内存的指针构造异常。