В последнее время я работаю над библиотекой Matrix для личного использования. Я пробовал написать код, который возвращает мой класс Matrix (например, перегрузки операторов, преобразования и инверсии), но возникает странная ошибка. Visual Studio говорит, что он бросает точку прерывания, возможно, из-за поврежденной кучи, а затем он говорит что-то об ошибке отладки. Я пробовал несколько членов моего кода, и только код, который возвращает матрицу, терпит неудачу таким образом.Ошибка при возврате объекта класса в C++
Я думал о передаче указателя предустановленного объекта через аргументы члена, но это, по-видимому, просто не работает с перегрузками оператора. Любая помощь?
Вот сообщение об ошибке:
Windows, имеет срабатывают контрольные точки в проекте Sapphire.exe.
Это может быть связано с повреждением кучи, что указывает на ошибку в файле Project Sapphire.exe или в любой загруженной библиотеке DLL.
Это также может быть связано с нажатием пользователя F12 во время проекта Sapphire.exe имеет фокус. «
» Ошибка отладки Assertion!
Программа: ... \ Desktop \ Programs \ Проект Sapphire \ Debug \ Project Sapphire.exe файл: minkernal \ CRTS \ ucrt \ SRC \ appcrt \ куча \ debug_heap.cpp линия 888
Expression: _CrtlsValidHeapPointer (блок)
для получения информации о том, как ваша программа может вызвать сбой в утверждении, смотрите в документации Visual C++ на утверждает
(Нажмите Retry для отладки приложения)
Вот код:
Matrix.h
#pragma once
#include "stdafx.h"
#include <vector>
class Matrix
{
private:
std::vector<std::vector<float>> data;
public:
std::vector<int> getSize();
//Operator overloads
std::vector<float> operator[](int index);
Matrix operator+(const Matrix& fuz);
//Constructor and destructor
Matrix(int dim1, int dim2);
~Matrix();
};
Matrix.cpp
#include "stdafx.h"
#include "Matrix.h"
std::vector<int> Matrix::getSize() //This seems to work well
{
std::vector<int> size(2);
size[0] = data.size();
size[1] = (data.size() >= 1) ? data[0].size() : 0; //Makes sure to not try to access an empty vector
return size;
}
//Operator Overloads
std::vector<float> Matrix::operator[](int index)
{
return data.at(index); //Does the same thing as data[], from what I can tell
}
Matrix Matrix::operator+(const Matrix& fuz)
{
if ((fuz.data.size() == this->getSize()[0]) && (fuz.data[0].size() == this->getSize()[1])) //Makes sure that the matrix dimensions align
{
Matrix ret = *this; //The return matrix. Starts out as a copy of this matrix
for (int i = 0; i < this->getSize()[0]; i++)
{
for (int j = 0; j < (int) this->getSize()[1]; j++)
{
ret[i][j] += fuz.data[i][j]; //Goes through and adds the two matrices
}
}
return ret; //Error happens HERE
}
return Matrix(1, 1); //Otherwise, return a scalar
}
//Constructor and Destructor
Matrix::Matrix(int dim1, int dim2)
{
data.resize(dim1); //Allocate the first dimension of the matrix
for (int i = 0; i < dim1; i++) //Allocate the second dimension of the matrix
data[i].resize(dim2);
}
Matrix::~Matrix()
{
for (int i = 0; i < this->getSize()[0] - 1; i++) //Destruct each vector inside of the vector
data[i].~vector();
data.~vector(); //Delete the actual data
delete[] & data; //Finally, delete data
}
ProjectSapphire.cpp
// Project Sapphire.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream>
//#include "Node.h"
#include "Matrix.h"
//namespace SWF = System::Windows::Forms;
int main()
{
Matrix test(2,3);
int size[] = { test.getSize()[0], test.getSize()[1] };
test[0][0] = 1;
test[0][1] = 2;
test[0][2] = 3;
test[1][0] = 4;
test[1][1] = 5;
test[1][2] = 6;
Matrix foo = test;
Matrix deet = foo + test;
return 0;
}
Если вы не можете вернуть ret, то, по-видимому, на Матрице нет конструктора копий. –
У вас, вероятно, много ошибок в коде, который вы не показываете, а также ошибки в том, что вы показали. Вы должны разместить MCVE. – juanchopanza
Вы можете скопировать/вставить точную ошибку, пожалуйста? Это позволит нам помочь вам лучше и позволить людям, имеющим ту же самую проблему, легко найти ответ – Guiroux