c ++代码编译时没有错误,但在运行时会出现“Segmentation fault”

时间:2015-04-14 11:13:08

标签: c++ constructor segmentation-fault destructor

我无法理解我的问题。我有文件:

/ * 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)

我认为它与我的析构函数有关,但无法理解问题所在。

2 个答案:

答案 0 :(得分:4)

问题是,你永远不会初始化你的数据库&#34; arr&#34;您的Point类。在

double* arr = nullptr;

arr = new double[3];
构造函数中的

创建一个本地指针&#34; arr&#34;并初始化本地指针,但不是你的类成员&#34; arr&#34;。 当你试图删除&#34; arr&#34;在你的析构函数中,你试图删除&#34; arr&#34;您的班级,从未分配和初始化。

答案 1 :(得分:0)

// 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;
};

在代码中查看我的评论......

除此之外,您的代码还存在许多问题:

  • 默认的复制构造函数是不够的。
  • 为标准保留前缀作为前缀。
  • 使用标准容器(例如矢量或数组)而不是尝试管理 记住你自己。
  • 为什么首先有阵列? Aren成员变量x,y,z足够好吗?

问候,Werner