分段错误: 11 ?C++

Segmentation fault: 11 ? C++

本文关键字:C++ 错误 分段      更新时间:2023-10-16

你能说出为什么这会产生分割错误吗?调用运算符 [] 时似乎出现问题,当我不调用它时,情况正常。运算符 [] 应该返回对索引为 i 的元素的引用。任何帮助都会很棒..

//dynamic_array.cpp file
#include <iostream>
#include "dynamic_array.h"
using namespace std;
dynamic_array::dynamic_array() {
        int *array;
        array=new int[4];
        array[0]=3;
        size = 4;
        allocated_size = 5;         
}
dynamic_array::~dynamic_array() {
    delete [] array;
}
int dynamic_array::get_size(void) const {
    return size;
}
int dynamic_array::get_allocated_size(void) const {
    return allocated_size;
}
int& dynamic_array::operator[](unsigned int i) {
        return array[i];
       }
//test.cpp file
#include <iostream>
#include <stdlib.h>
#include "dynamic_array.h"
using namespace std;

int main() {
  dynamic_array a;
  cout << a[0];
}
 //dynamic_array.h file
 using namespace std;
 class dynamic_array {
 public:
      enum {
       BLOCK_SIZE = 5,
       SUBSCRIPT_RANGE_EXCEPTION = 1,
       MEMORY_EXCEPTION = 2,
   };
   dynamic_array();
   ~dynamic_array();
   int get_size(void) const;
   int get_allocated_size() const;
   int& operator[](unsigned int i);
   class exception {
       public:
           exception(int n0) { n = n0; };
           int n;
   };
  private:
   int *array; // pointer to dynamically allocated memory
   int allocated_size; // total number of elements in allocated memory
   int size; // number of active elements
   };

本地声明

    int *array;

影子成员array .因此,以下代码使用局部变量,而不是成员。因此,成员是未初始化的。


不要创建自己的动态数组,而是使用 std::vector .

这样更安全、更方便。


在其他新闻中:

  • 例如,get前缀 get_size是爪哇主义。
    C++get前缀没有任何优势,并且会使代码的可读性降低。例如,标准库容器具有 size 方法,而不是 get_size

  • 使用void作为正式的论证声明,如get_size(void),是一种C主义。
    在 C 语言中,它有一个重要的效果,那就是告诉编译器实际上没有参数,而不是任何参数。在C++ ()中表示了这一点。

  • 没有const版本的operator[]与早期使用const不一致。
    一致性在编程中非常重要。我们的期望,例如在维护代码时,是一致的。不一致的代码会增加昂贵的维护工时。

  • 常量ALL UPPERCASE标识符是Java主义。
    Java缺少预处理器,并且继承了早期C的全大写约定,缺乏const。C++同时具有const和预处理器。有了const,通常不需要对常量使用 #define(如早期的 C 语言),并且有一个预处理器,有一个很好的技术理由不使用全部大写(它与宏名称的约定冲突)。此外,许多/大多数程序员将所有大写字母视为喊叫。好痛。

  • exception最好从std::exception
    派生。与其发明自己的可以携带错误代码的异常类,不如使用 std::system_error .这就是它的用途。或者,从 std::runtime_error 派生一个类,或者直接使用 std::runtime_error

问题出在您的构造函数中

对于构造函数,如下所示:

dynamic_array::dynamic_array() {
    array = new int[4];
    array[0] = 3;
    size = 4;
    allocated_size = 5;
}

问题是构造函数中的这行额外的代码:

int *array; 

在构造函数定义中,您声明了一个名为 array 的新局部指针变量,并为此分配了内存。

但是这个变量是构造函数的本地变量,它不是你所相信的在你的类中声明的变量。