使用指针向量矩阵在对象上调用析构函数时程序崩溃

时间:2017-12-14 09:50:22

标签: c++ pointers destructor

我有一个class,它基本上是指向另一个对象的2D matrix指针的包装器,矩阵由vectors组成。

出于某种原因,只要我的class的析构函数被调用,程序就会崩溃,并且它似乎正在尝试delete指针,即使它们是nullptr,这会导致崩溃。

以下是我的.h.cpp文件:

cpp文件:

RotationSolution.h

#ifndef PUZZLESOLVER_ROTATIONSOLUTION_H
#define PUZZLESOLVER_ROTATIONSOLUTION_H

#include <vector>
#include <fstream>
#include "PuzzlePiece.h"

using namespace std;

class RotationSolution {
private:
    int _height, _width;
    vector<vector<PuzzlePiece*>> _matrix;

public:
    RotationSolution();

    RotationSolution(int height, int width);

    vector<PuzzlePiece*>& operator[](int row);

    int get_height() const;

    int get_width() const;
};


#endif //PUZZLESOLVER_ROTATIONSOLUTION_H

RotationSolution.cpp:

#include "RotationSolution.h"

vector<PuzzlePiece*>& RotationSolution::operator[](int row) {
    return _matrix[row];
}

RotationSolution::RotationSolution() : RotationSolution(0, 0) {}

RotationSolution::RotationSolution(int height, int width) :
    _height(height), _width(width), _matrix(vector<vector<PuzzlePiece*>>(_height, vector<PuzzlePiece*>(_width, nullptr)))
{}

int RotationSolution::get_height() const {
    return _height;
}

int RotationSolution::get_width() const {
    return _width;
}

代码实际上在一个看起来像这样的部分崩溃:

    for (auto length: _rowLengths) {
        auto height = size / length;
        _sol = RotationSolution(height, length);

        ...
    }

_sol = RotationSolution(height, length);行的第二次迭代中。

调试时,发送崩溃信号的代码来自new_allocator.h(我很确定它是一个lib文件):

  // __p is not permitted to be a null pointer.
  void
  deallocate(pointer __p, size_type)
  { ::operator delete(__p); }

我仍然是c++的新手,所以请原谅任何noob错误和不良行为:)

1 个答案:

答案 0 :(得分:1)

RotationSolution类中存在一个设计缺陷 - 它包含存储原始指针的成员变量_matrix,它缺少正确定义的分配运算符,它将克隆存储在_matrix中的对象。 Default generated copy assigment operator只会复制可能导致双重释放内存和崩溃的指针(here是一些解释正在发生的事情和原因)。尝试使用&#34; vector&lt;矢量&lt;的std :: shared_ptr的&LT; PuzzlePiece&gt; &GT; &GT; _Matrix应留作&#34; (也做#include&#34;内存&#34;)它应该用错误的内存管理解决大多数问题。这里有关于智能指针的tutorial