C ++删除分配给新的字符指针

时间:2020-01-23 21:12:18

标签: c++ char new-operator dynamic-memory-allocation delete-operator

在这段代码中,当第一个数字是2D数组的大小时,我正在从文件中获取数字。

在我的代码中,我要定义

char *filename=new char;

(我必须使用char *文件名,这是练习。) 一切正常,直到我尝试delete为止。 deletedelete[]都给我错误并导致程序崩溃。

这是我的完整代码:

#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;
}

这是我文件的外观:

enter image description here

这是运行代码后控制台应用程序的外观:

enter image description here

这是我期望得到的,但出现此错误:

enter image description here

有人知道这会发生什么,我怎么做才能解决?

5 个答案:

答案 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;
}