我有一个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错误和不良行为:)
答案 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。