分段错误: 11 ?C++
Segmentation fault: 11 ? C++
你能说出为什么这会产生分割错误吗?调用运算符 [] 时似乎出现问题,当我不调用它时,情况正常。运算符 [] 应该返回对索引为 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 的新局部指针变量,并为此分配了内存。
但是这个变量是构造函数的本地变量,它不是你所相信的在你的类中声明的变量。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'