分段错误:C ++ IntVector中为11
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分段错误:C ++ IntVector中为11相关的知识,希望对你有一定的参考价值。
我正在尝试在C ++中实现intvector并收到“细分错误:11”错误。我知道这与内存管理有关,考虑到我对C ++的陌生感,这肯定是一个很小的错误。我用valgrind调试了代码,并收到如下消息:
使用大小为8的未初始化值,大小为4的无效读取,有条件的跳转或移动取决于未初始化的值。
我最好的猜测是,这与我实现数组的方式有关。我最初将数组存储在堆上,但将其更改为堆栈,但仍然遇到相同的错误。我已经在Java中实现了一个intvector,所以我试图在这里使用类似的逻辑,这也许是问题的一部分。
#include <iostream>
#include "IntVector.h"
#include <cmath>
using namespace std;
int num_elements = 0;
int array_size = 0;
int expansion_factor;
void IntVector::expandArray(){
int tempArr[array_size*2];
for(int i =0;i<array_size;i++){
tempArr[i] = array[i];
}
array = tempArr;
array_size = array_size * 2;
}
void IntVector::add(int val){
int tempArr[array_size];
if(array_size == num_elements){
expandArray();
array[num_elements] = val;
}
else{
for(int i = 0;i<array_size;i++){
tempArr[i] = array[i];
}
tempArr[num_elements] = val;
array = tempArr;
}
num_elements++;
}
void IntVector::remove(int index){
}
int IntVector::get(int index) const{
return index;
}
void IntVector::removeLast(){
}
void IntVector::set(int index, int val){
}
std::string IntVector::toString()const {
return "";
}
IntVector::IntVector(int initial_size){
int* array = new int[initial_size];
}
IntVector:: ~IntVector(){
delete[] array;
}
int main(){
IntVector v(0);
v.add(5);
}
#ifndef INTVECTOR_H_
#define INTVECTOR_H_
using std::cout;
class IntVector {
private:
int* array;
int num_elements;
int array_size;
int expansion_factor;
void expandArray();
public:
void add(int val);
void remove(int index);
int get(int index) const;
void removeLast();
void set(int index, int val);
std::string toString() const;
IntVector(int initial_size);
~IntVector();
};
#endif
答案
如评论中所述,在您对C ++的理解中肯定存在一些漏洞。实际上,在处理头文件时,您应该有一个main.cpp,someotherfile.h和someotherfile.cpp。这是避免重新定义错误的最佳实践。
以上是关于分段错误:C ++ IntVector中为11的主要内容,如果未能解决你的问题,请参考以下文章