2016-03-01 6 views
-1

В последнее время я работаю над библиотекой 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; 
} 
+0

Если вы не можете вернуть ret, то, по-видимому, на Матрице нет конструктора копий. –

+0

У вас, вероятно, много ошибок в коде, который вы не показываете, а также ошибки в том, что вы показали. Вы должны разместить MCVE. – juanchopanza

+0

Вы можете скопировать/вставить точную ошибку, пожалуйста? Это позволит нам помочь вам лучше и позволить людям, имеющим ту же самую проблему, легко найти ответ – Guiroux

ответ

3

Код в вашем деструкторе - полная глупость. Вероятно, это источник вашей проблемы.

Удалите весь код в деструкторе (желательно, полностью удалите деструктор).

Вкратце, ваш код выглядит ОК, кроме этого.

Это вызывает неопределенное поведение для двойного вызова деструктора для вектора.(Деструктор переменных-членов вызывается компилятором после завершения деструктора класса, если таковой имеется).

-1

Возможно, конструктор копирования/перемещения Matrix поврежден/удален/закрыт.

0

Просто никогда не называйте деструктор вручную. Читайте о RAII. Все объекты уничтожаются автоматически.

Смежные вопросы