c++ 代码编译没有错误,但在 运行 时出现“分段错误”
c++ code compiles without errors but gives a `Segmentation fault` while running
我无法理解我的问题。我有文件:
/* main.C */
#include <iostream>
#include "point.h"
using namespace std;
int main()
{
Point p_default;
p_default.print();
Point p_equal(2.5);
p_equal.print();
Point p_full(1.23, 2.4, 0.18);
p_full.print();
return 0;
}
/*point.h*/
#include <iostream>
using namespace std;
class Point {
double x, y, z;
double* arr;
public:
// constructors
Point (); // default
Point (double); // equal arguments
Point (double _x, double _y, double _z); // standard
// destructor
~Point ();
// print function
void print () const;
};
/* point.C */
#include <iostream>
#include "point.h"
using namespace std;
// constructors
Point::Point () : Point(0.0) {}; // default - zero initialised
Point::Point (double _c) : Point(_c, _c, _c) {}; // equal arguments
// standard constructor
Point::Point (double _x, double _y, double _z = 0.0)
: x(_x), y(_y), z(_z) {
double* arr = nullptr;
arr = new double[3];
*arr = x;
*(arr + 1) = y;
*(arr + 2) = z;
};
// destructor
Point::~Point () {
delete[] arr;
};
// print function
void Point::print () const {
cout << "Point(" << x << ", " << y << ", " << z << ")" << endl;
};
我使用以下命令编译我的项目:g++ -Wall -std=c++11 main.C point.C -o main
。它编译时没有任何错误或警告,但是当我 运行 它与 ./main
它正确打印所有内容并最终给我 Segmentation fault
:
Point(0, 0, 0)
Point(2.5, 2.5, 2.5)
Point(1.23, 2.4, 0.18)
Segmentation fault (core dumped)
我假设它与我的析构函数有关,但无法理解问题出在哪里。
问题是,您从未初始化点 class 的数据成员 "arr"。
double* arr = nullptr;
arr = new double[3];
在您的构造函数中创建一个本地指针 "arr" 并初始化本地指针,但不是您的 class 成员 "arr"。
当您尝试在析构函数中删除 "arr" 时,您尝试删除从未分配和初始化的 class 的 "arr"。
// standard constructor
Point::Point (double _x, double _y, double _z = 0.0)
: x(_x), y(_y), z(_z) {
// This is local, yet you are deleting the non-initialized member
// in your destructor!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
double* arr = nullptr;
arr = new double[3];
*arr = x;
*(arr + 1) = y;
*(arr + 2) = z;
};
看我在代码中的注释...
除此之外你的代码还有很多问题:
- 默认的复制构造函数是不够的。
- 下划线作为标准保留的前缀。
- 使用标准容器(例如向量或数组)而不是尝试管理
自己回忆一下。
- 为什么首先要有一个数组?成员变量x,y,z还不够好吗?
此致,维尔纳
我无法理解我的问题。我有文件:
/* main.C */
#include <iostream>
#include "point.h"
using namespace std;
int main()
{
Point p_default;
p_default.print();
Point p_equal(2.5);
p_equal.print();
Point p_full(1.23, 2.4, 0.18);
p_full.print();
return 0;
}
/*point.h*/
#include <iostream>
using namespace std;
class Point {
double x, y, z;
double* arr;
public:
// constructors
Point (); // default
Point (double); // equal arguments
Point (double _x, double _y, double _z); // standard
// destructor
~Point ();
// print function
void print () const;
};
/* point.C */
#include <iostream>
#include "point.h"
using namespace std;
// constructors
Point::Point () : Point(0.0) {}; // default - zero initialised
Point::Point (double _c) : Point(_c, _c, _c) {}; // equal arguments
// standard constructor
Point::Point (double _x, double _y, double _z = 0.0)
: x(_x), y(_y), z(_z) {
double* arr = nullptr;
arr = new double[3];
*arr = x;
*(arr + 1) = y;
*(arr + 2) = z;
};
// destructor
Point::~Point () {
delete[] arr;
};
// print function
void Point::print () const {
cout << "Point(" << x << ", " << y << ", " << z << ")" << endl;
};
我使用以下命令编译我的项目:g++ -Wall -std=c++11 main.C point.C -o main
。它编译时没有任何错误或警告,但是当我 运行 它与 ./main
它正确打印所有内容并最终给我 Segmentation fault
:
Point(0, 0, 0)
Point(2.5, 2.5, 2.5)
Point(1.23, 2.4, 0.18)
Segmentation fault (core dumped)
我假设它与我的析构函数有关,但无法理解问题出在哪里。
问题是,您从未初始化点 class 的数据成员 "arr"。
double* arr = nullptr;
arr = new double[3];
在您的构造函数中创建一个本地指针 "arr" 并初始化本地指针,但不是您的 class 成员 "arr"。 当您尝试在析构函数中删除 "arr" 时,您尝试删除从未分配和初始化的 class 的 "arr"。
// standard constructor
Point::Point (double _x, double _y, double _z = 0.0)
: x(_x), y(_y), z(_z) {
// This is local, yet you are deleting the non-initialized member
// in your destructor!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
double* arr = nullptr;
arr = new double[3];
*arr = x;
*(arr + 1) = y;
*(arr + 2) = z;
};
看我在代码中的注释...
除此之外你的代码还有很多问题:
- 默认的复制构造函数是不够的。
- 下划线作为标准保留的前缀。
- 使用标准容器(例如向量或数组)而不是尝试管理 自己回忆一下。
- 为什么首先要有一个数组?成员变量x,y,z还不够好吗?
此致,维尔纳