代码之家  ›  专栏  ›  技术社区  ›  Tomer Amir

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

  •  1
  • Tomer Amir  · 技术社区  · 7 年前

    我有一个 class 它基本上是 2D matrix 指向另一个对象的指针,矩阵由 vectors .

    由于某种原因,每当我的析构函数 正在被呼叫,而且似乎它正在试图 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
    

    旋转解决方案。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 回复  |  直到 7 年前
        1
  •  1
  •   Максим Антіпов    7 年前

    RotationSolution类中存在一个设计缺陷-它包含存储原始指针的成员变量\u matrix,并且它缺少正确定义的assignment操作符,该操作符将克隆存储在\u matrix中的对象。 Default generated copy assigment operator 将只复制可能导致双重释放内存和崩溃的指针( here 是一些正在发生的事情和原因的解释)。尝试使用“vector<vector<std::shared\u ptr<PuzzlePiece>\u matrix”(也包括“memory”),它应该可以解决大多数错误内存管理的问题。这里是 tutorial 阅读有关智能指针的信息。