1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Irritating heap corruption error in VC++2005

  1. Mar 10, 2008 #1
    'kay, I've been doing coasting along in C++, overloading operators, defining matrix arithmetic... Except, there's this error stopping my otherwise flawless addition function from working. When the function ends, it calls ~matrix(), probably for the temp variable inside the function, and the delete [] data_ corrupts the heap. How, I don't know, so I'm showing you guys in the hope that someone will spot what I've done wrong.

    HelloWorld.cpp:
    Code (Text):
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include "matrix.h"

    using namespace std;
    typedef unsigned char byte;

    int main(int argc, _TCHAR* argv[])
    {
        matrix tst1(5,5);
        matrix tst2(5,5);
        matrix tst3(3,6);
        tst1(3,4)=56;
        tst3=tst2+tst1;
        int tst=tst3(3,4);
        cout << tst;

        return 0;
    };
     
    stdafx.h:
    Code (Text):
    // stdafx.h : include file for standard system include files,
    // or project specific include files that are used frequently, but
    // are changed infrequently
    //

    #pragma once


    #define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
    #include <stdio.h>
    #include <tchar.h>



    // TODO: reference additional headers your program requires here
     
    matrix.h:
    Code (Text):
    #define MATRIX_TYPE unsigned char

    using namespace std;
    //typedef unsigned char byte; --no longer needed due to #define directive

    class matrix
    {
        MATRIX_TYPE* data_; //using underscores to distinguish internal variables -- worth changing the rest of the code?
        int rows_,cols_;
    public:
        matrix(int rows, int cols); //constructor
        ~matrix(); //destructor DUMMY

        MATRIX_TYPE& operator() (int row, int col); //subscript operator
        MATRIX_TYPE  operator() (int row, int col) const; // subscript operator for constants
        matrix operator+(matrix op1); //matrix addition
        matrix& operator=(const matrix& op1); //assignment of a matrix, to account for size differences
    };

    matrix::matrix(int rowin, int colin)
    {
        if(rowin==0){rows_=1;}else{rows_=rowin;};
        if(colin==0){cols_=1;}else{cols_=rowin;};
        data_=new MATRIX_TYPE[(rows_*cols_)-1];
    };

    matrix::~matrix()
    {
        delete[] data_;
    };

    MATRIX_TYPE& matrix::operator() (int row, int col)
    {
        if(row<rows_ && col<cols_)
        {
            return data_[(cols_*row)+col];
        }else{
            cout << "index out of range for this array" << endl;
            return data_[0];
        };
    };

    MATRIX_TYPE  matrix::operator() (int row, int col) const
    {
        if(row<rows_ && col<cols_)
        {
            return data_[(cols_*row)+col];
        }else{
            cout << "index out of range for this array" << endl;
            return data_[0];
        };
    };

    matrix& matrix::operator=(const matrix& op1)
    {
        if(this != &op1) //must not be the same object!
        {
            delete[] data_; //get rid of the old data
            rows_=op1.rows_; // make this new matrix have the same dimensions as the old one
            cols_=op1.cols_;
            data_=new MATRIX_TYPE[(rows_*cols_)-1]; //reassign space for data

            for(int r=0;r<rows_;r++)
            {
                for(int c=0;c<cols_;c++)
                {
                    data_[(cols_*r)+c]=op1(r,c); //copy data over from other matrix
                };
            };

        };
        return *this;
    };

    matrix matrix::operator +(matrix op1)
    {
        if((op1.rows_==rows_)&&(op1.cols_==cols_))
        {
            matrix result(rows_,cols_);
            for(int r=0;r<rows_;r++)
            {
                for(int c=0;c<cols_;c++)
                {
                    result(r,c)=op1(r,c)+data_[(cols_*r)+c]; // fill result matrix with sums
                };
            };
            return result; // this line keeps causing a heap corruption!
        }else{
            cout << "matricies are not of equal dimension" << endl;
            matrix ret(1,1);
            return ret;
        };
    };
     
  2. jcsd
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Can you help with the solution or looking for help too?
Draft saved Draft deleted



Similar Discussions: Irritating heap corruption error in VC++2005
Loading...