I've seen many similar questions, yet I do not arrive to solve the problem in my implementation.
I am working on a C++ program to solve the 2D-heat-equation. Here I reproduce the blocks of the error only, I've omitted a lot of code doing other stuff and constant values in the equations. Given the math context, I will use matrix vocabulary in some places.
I understand that I may be trying to access unreachable memory, yet I cannot see why.
vector has dimension dim=1001
, so vector_[0]
should exist and in the loop from i=1...dim-1
everything should be reachable.
matrix_ on the other hand has dimensions (maxT+1, dim)
. The loop over t in [1...maxT]
looks reachable to me and then in the loop over i
the program access each row of the matrix and access it's i
th element, since it goes to dim-1
then the indexing matrix_[t][i+1]
should also be reachable in the last iteration with i<dim-1 <1001-1=1000
so i=999
therefore in the last iteration it is matrix_[t][1000]
, that is the last element of the t
-row.
myclass.h
#include <vector>
using vector_double = std::vector<double>;
using matrix2d = std::vector<std::vector<double>>;
class Myclass{
protected:
matrix2d matrix_;
vector_double vector_;
size_t dim;
size_t maxT;
double initValue;
public:
Myclass();
void routine();
};
myclass.cpp
#include "myclass.h"
Myclass::Myclass()
{
size_t dim = 1001;
size_t maxT = 1001;
double initValue = 13.0;
matrix2d matrix_(maxT+1, vector_double(dim,initValue));
vector_double vector_(dim);
}
void Myclass::routine()
{
vector_[0] = initValue;
for(size_t t=1; t<maxT; t++)
{
vector_[0] = matrix_[t][0] + matrix_[t][0];
for(size_t i=1; i < dim-1; i++)
{
vector_[i] = matrix_[t][i-1] + matrix_[t][i] + matrix_[t][i+1];
}
}
}
so.cpp
#include "myclass.h"
int main()
{
Myclass myobject;
myobject.routine();
return 0;
}
I compile with: g++ -g -O1 *.cpp -o out
and run valgrind with valgrind --leak-check=yes ./out
.
To get the following error:
==25934== Memcheck, a memory error detector
==25934== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==25934== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==25934== Command: ./out
==25934==
==25934== Invalid write of size 8
==25934== at 0x109217: Myclass::routine() (myclass.cpp:15)
==25934== by 0x109577: main (so.cpp:7)
==25934== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==25934==
==25934==
==25934== Process terminating with default action of signal 11 (SIGSEGV)
==25934== Access not within mapped region at address 0x0
==25934== at 0x109217: Myclass::routine() (myclass.cpp:15)
==25934== by 0x109577: main (so.cpp:7)
==25934== If you believe this happened as a result of a stack
==25934== overflow in your program's main thread (unlikely but
==25934== possible), you can try to increase the size of the
==25934== main thread stack using the --main-stacksize= flag.
==25934== The main thread stack size used in this run was 8388608.
==25934==
==25934== HEAP SUMMARY:
==25934== in use at exit: 0 bytes in 0 blocks
==25934== total heap usage: 1,006 allocs, 1,006 frees, 8,136,784 bytes allocated
==25934==
==25934== All heap blocks were freed -- no leaks are possible
==25934==
==25934== For lists of detected and suppressed errors, rerun with: -s
==25934== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)
So what I am looking for is the way to make routine
actually update the values of vector
at each time t
of the outer loop, which is not happening because of the segmentation fault.
Thanks