分段错误: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 中声明的变量。
你能说说为什么会产生分段错误吗?调用 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 中声明的变量。