分段错误: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的主要内容,如果未能解决你的问题,请参考以下文章

带有 std::promise 的 C++11 分段错误

C++ 代码的分段错误(核心转储)

分段错误:11 - C 函数

在 C 中使用 fgets 时出现“分段错误:11”

通过共享内存和管道的 IPC 给出分段错误:C 中的 11

如何在此 c 代码中找到分段错误?