分段错误:11? C++

Segmentation fault: 11 ? C++

你能说说为什么会产生分段错误吗?调用 operator[] 时似乎会出现问题,而当我不调用它时,一切正常。 operator[] 应该 return 对索引为 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 是 Java-ism.
    在 C++ 中,get 前缀没有任何优势,它会降低代码的可读性。例如,标准库容器有一个 size 方法,而不是 get_size.

  • 使用void作为形式参数声明,如get_size(void),是C-ism.
    在 C 中,它的重要作用是告诉编译器确实没有参数,而不是任何参数。在 C++ 中 () 表示。

  • 没有 const 版本的 operator[] 与之前使用的 const.
    不一致 一致性在编程中非常重要。我们的期望,例如在维护代码时,它是一致的。不一致的代码会增加 man-hours 维护成本。

  • 常量的 ALL UPPERCASE 标识符是 Java-ism.
    Java 缺少预处理器,并继承了早期 C 中缺少 const 的全大写约定。 C++ 有 const 和预处理器。使用 const 通常不需要使用 #define 作为常量(如在早期的 C 中),并且使用预处理器有一个很好的技术理由不使用全部大写(它与宏名称的约定冲突) .此外 many/most 程序员将所有大写字母视为喊叫。好疼

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

问题出在你的构造函数中

构造函数像这样:

dynamic_array::dynamic_array() {

    array = new int[4];
    array[0] = 3;
    size = 4;
    allocated_size = 5;
}

问题出在构造函数中的这行附加代码:

int *array; 

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

但是这个变量是构造函数的局部变量,它不是您所相信的 class 中声明的变量。