Вы пытаетесь delete
a char*
, который не указывает на память, выделенную с помощью new
.
В этой строке:
char *filename = new char;
Вы делаете new
некоторая память (одна char
, а не строка char
с). Но затем в этой строке:
filename = "text.txt";
Вы изменяете указатель char*
, чтобы указывать на совершенно другую память, таким образом, утечка памяти, которую вы new
'редактировали.
Затем в этой строке :
delete filename;
Вы пытаетесь delete
буквально "text.txt"
, а не char
you new
'ed. Вот почему вы делаете sh.
Для того, что вы пытаетесь сделать, вам нужно сделать это вместо этого:
char *filename = new char[strlen("text.txt")+1];
strcpy(filename, "text.txt");
...
delete[] filename;
Однако вам не следует использовать new
/ new[]
для filename
вообще. Вместо этого используйте std::string
:
#include <fstream>
#include <string>
double **readmat(const std::string &filename, int *size)
{
std::ifstream read(filename.c_str());
...
}
int main()
{
int size;
double **arr = readmat("text.txt", &size);
...
}
В качестве альтернативы:
#include <fstream>
#include <string>
double **readmat(const char *filename, int *size)
{
ifstream read(filename);
...
}
int main()
{
int size;
std::string filename = "text.txt";
double **arr = readmat(filename.c_str(), &size);
// or simply:
// double **arr = readmat("text.txt", &size);
...
}
И затем, пока вы это делаете, вам также не следует использовать new[]
для своей матрицы. Используйте std::vector
вместо:
#include <vector>
std::vector< std::vector<double> > readmat(char *filename)
{
...
int size;
read >> size;
std::vector< std::vector<double> > mat(size);
for (int i = 0; i < size; i++)
{
mat[i].resize(size);
for (int j = 0; j < size; j++)
{
read >> mat[i][j];
}
}
return mat;
}
int main()
{
...
std::vector< std::vector<double> > arr = readmat("text.txt");
size_t size = arr.size();
for (size_t i = 0; i < size; i++)
{
for (size_t j = 0; j < size; j++)
{
std::cout << arr[i][j] << " , ";
}
std::cout << endl;
}
std::cout << endl;
return 0;
}