[c ++删除分配给new的char指针

问题描述 投票:0回答:2

在此代码中,当第一个数字是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

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

c++ char new-operator dynamic-memory-allocation delete-operator
2个回答
1
投票
char *filename = new char;
filename = "text.txt";

这将创建一个新的char,然后将其泄漏,因为指针filename被重新分配给静态声明的对象。

因此,稍后您将删除原始字符以外的其他内容。

这里有多个问题(使用new代替new [],等等)。建议,忘记everything并使用std :: string和STL。


0
投票

这是您问题的根源:

char *filename = new char;
filename = "text.txt";

filename不再指向动态分配的内存,因此您无法delete(并且还会泄漏1个字节的内存)。将声明更改为char *filename = test.txt;,然后删除delete filename;


0
投票

您正在尝试delete指向不由char*分配的内存的new

在此行:

char *filename = new char;

您为new做一些内存(单个char,而不是char的字符串)。但是然后在这一行:

filename = "text.txt"; 

您更改char*指针以指向完全不同的内存,从而泄漏了您new所需要的内存。

然后在此行上:

delete filename;

您尝试delete文字,而不是"text.txt"char。这就是您崩溃的原因。


0
投票

new”在堆上分配一个single字符。大多数将new char作为参数的函数都希望有一个指向array的第一个元素的指针,并以空字符(const char*)作为分隔符(C风格的字符串)。

您甚至不应该将字符串文字分配给类型为\0的变量,至少在标准C ++中不行。您也不需要为字符串文字动态分配内存,只需使用

char *

然后,您也不会删除指向字符串文字的指针。

© www.soinside.com 2019 - 2024. All rights reserved.