首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用delete-operator时程序停止工作

使用delete-operator时程序停止工作
EN

Stack Overflow用户
提问于 2019-02-02 16:01:27
回答 2查看 67关注 0票数 0

我刚开始使用delete操作符,我有点困惑,为什么当我试图从指针数组中删除一个元素时,我的程序总是崩溃。它在两次删除时都会崩溃,我注释掉了另一个for循环来测试这一点。

代码语言:javascript
复制
int main()
{
    char ** str_array = nullptr;
    char * str = nullptr;
    char delimiter = ' ';
    int arraySize = 0;

    str = new char [51];

    cout << "Enter a string" << endl;
    cin.clear();
    cin.ignore( cin.rdbuf() -> in_avail() );
    cin.getline(str, 50);
    cin.clear();

    arraySize = StrToArray(str_array, str, delimiter);

    for (int i = 0; i < arraySize; i++)
    {
        cout << str_array[i] << endl;
    }

    for (int i = 0; i < arraySize; ++i)
    {
        delete [] str_array[i];
    }
    delete [] str_array;

    return 0;
}

下面是我用来初始化str_array的函数。

代码语言:javascript
复制
int StrToArray(char **& str_array, char * str, char delimiter)
{
    int size = 0;
    int arraySize = 0;
    int start = 0;
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == ' ') 
        {
            size++;
            if (str[i + 1] == '\0' || str[i + 1] == ' ')
            {
                size--;
            }
        }
    }

    str_array = new char * [size];

    for (int i = 0; i < strlen(str) + 1; i++)
    {
        if ((str[i] == ' ' || str[i] == '\0') && !(str[i + 1] == '\0' || str[i + 1] == ' '))
        {
            str_array[arraySize] = new char[i-start];
            arraySize++;
            for (int x = 0; x <= i - start; x++)
            {
                str_array[arraySize-1][x] = str[x + start];

                if (x == i-start)
                {
                    str_array[arraySize - 1][x] = '\0';
                }
            }

            i++;
            start = i;
        }

    }
    return (size + 1);
}

我的str_array被初始化为一个指针数组,每个指针指向一个cString。我要做的是删除数组中的每个元素,然后删除数组本身。但是,每次我尝试执行这两个删除操作符时,我的代码都会崩溃。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-02 16:48:18

我能看到的两个错误,都是‘差一个’错误

代码语言:javascript
复制
       str_array[arraySize] = new char[i-start];

应该是

代码语言:javascript
复制
       str_array[arraySize] = new char[i-start+1];

你还没有给nul终结者留出足够的空间。

代码语言:javascript
复制
str_array = new char * [size];

应该是

代码语言:javascript
复制
str_array = new char * [size+1];

因为空格的数量比单词的数量少一个。

我用"hello world“和你的代码为我运行的这两个更改进行了测试。

哦,alijandro所做的修正也是正确的,但对我来说,这并没有导致任何崩溃。

票数 0
EN

Stack Overflow用户

发布于 2019-02-02 16:27:23

你的str_arraystr_array[i]都是数组,你应该使用delete[]运算符来释放它们。下面是一个简单的例子。

代码语言:javascript
复制
void f(size_t size)
{
    char** str_array = new char* [size];
    for (int i = 0; i < size; ++i) {
        str_array[i] = new char[i];
    }

    for (int j = 0; j < size; ++j) {
        delete[] str_array[j];
    }

    delete[] str_array;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54491187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档