在这段代码中,当第一个数字是2D数组的大小时,我正在从文件中获取数字。
在我的代码中,我要定义
char *filename=new char;
(我必须使用char *文件名,这是练习。)
一切正常,直到我尝试delete
为止。 delete
和delete[]
都给我错误并导致程序崩溃。
这是我的完整代码:
#include <iostream>
#include <fstream>
using namespace std;
double **readmat(char *filename, int *size)/////question 2
{
ifstream read(filename);
cout << filename << endl;
if (!read)
{
cout << "Can't open file!" << endl;
exit(1);
}
read >> *size;
double **mat = new double*[*size];
for (int i = 0; i < *size; i++)
{
mat[i] = new double[*size];
for (int j = 0; j < *size; j++)
{
read >> mat[i][j];
}
}
read.close();
return mat;
}
int main()
{
int size;
char *filename = new char;
filename = "text.txt";
double **arr = readmat(filename, &size);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << arr[i][j]<<" , ";
}
cout << endl;
}
cout << endl;
delete filename; //<-------- this crashed my code
for (int i = 0; i < size; i++)
{
delete[] arr[i];
}
delete[] arr;
return 0;
}
这是我文件的外观:
这是运行代码后控制台应用程序的外观:
这是我期望得到的,但出现此错误:
有人知道这会发生什么,我怎么做才能解决?
答案 0 :(得分:5)
您正在尝试delete
的{{1}}并不指向用char*
分配的内存。
在这一行:
new
您要char *filename = new char;
做一些内存(单个new
,而不是一串char
)。但是然后在这一行:
char
您将filename = "text.txt";
指针更改为指向完全不同的内存,从而泄漏了char*
编辑过的内存。
然后在此行:
new
您尝试delete filename;
文字delete
,而不是您"text.txt"
编辑的char
。那就是你崩溃的原因。
对于您要尝试执行的操作,您需要执行以下操作:
new
但是,您实际上根本不应该为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
答案 1 :(得分:4)
char *filename = new char;
filename = "text.txt";
这将创建一个新的char,然后将其泄漏,因为指针filename
已重新分配给静态声明的对象。
因此,稍后您将删除原始字符以外的其他内容。
这里有多个问题(使用new代替new []等)。建议,忘记一切并使用std :: string和STL。
答案 2 :(得分:3)
这是您问题的根源:
char *filename = new char;
filename = "text.txt";
filename
不再指向动态分配的内存,因此您无法delete
(并且还会泄漏1个字节的内存)。将声明更改为const char *filename = "test.txt";
,然后删除delete filename;
。
答案 3 :(得分:2)
new char
在堆上分配一个单个字符。大多数使用const char*
作为参数的函数都希望有一个指向 array 的第一个元素的指针,并以空字符(\0
)作为定界符(C风格的字符串)。
您甚至不应该将字符串文字分配给类型char *
的变量,至少在标准C ++中不行。您也不需要为字符串文字动态分配内存,只需使用
const char *filename = "text.txt";
然后,您也不会删除指向字符串文字的指针。 (这就是最有可能导致错误的原因,您删除了一个指向字符串文字的指针)
答案 4 :(得分:0)
只需更换
char* filename = new char;
使用
const char* filename = "text.txt";
然后删除
delete filename;
这是您最终代码的外观
int main()
{
int size;
const char *filename = "text.txt";
double **arr = readmat(filename, &size);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << arr[i][j]<<" , ";
}
cout << endl;
}
cout << endl;
for (int i = 0; i < size; i++)
{
delete[] arr[i];
}
delete[] arr;
return 0;
}