首页 > 解决方案 > 删除动态 cstring 时程序崩溃

问题描述

我正在开展一个需要使用动态分配的 cstrings 的学校项目。在我的代码中,我有一个临时的 cstring,但每当我尝试删除它时它就会崩溃。

这是我的代码:

#include "group.h"
#include <iostream>

using namespace std;

void addGroup()
{

    group *newGroup = new group;
    char tempString[ARRAY_CONST];

    cin >> option;
    cin.ignore(100, '\n');

    if (option == 'Y' || option == 'y')
    {
        cout << "Enter name: ";

        cin.getline(tempString, ARRAY_CONST, '\n');
        char *tempName = new char[strlen(tempString + 1)];
        strcpy(tempName, tempString);

        cout << "Enter email: ";
        cin.getline(tempString, ARRAY_CONST, '\n');

        newGroup->setPromo(true, tempName, tempString);

        delete[] tempName;
    }
}

每当它到达“delete[] tempName”时,程序就会崩溃,这可能是编译器优化的副作用吗?

编辑:

我不确定在不添加太多代码的情况下应该包含多少代码,但这里是 setPromo():

bool group::setPromo(bool enroll, const char *name, const char *email)
{
    promo.enrolled = enroll;

    if (promo.name)
        delete[] promo.name;

    promo.name = new char[strlen(name) + 1];
    strcpy(promo.name, name);

    if (promo.email)
        delete[] promo.email;

    promo.email = new char[strlen(email) + 1];
    strcpy(promo.email, email);

    return true;
}

该组类具有私有数据成员,如下所示:

struct promotion
{
    bool enrolled;
    char *name;
    char *email;
} promo;

group 类有一个处理 newGroup 的析构函数。

再次编辑:

好的,我已经弄清楚了,但我不明白为什么?在包含以下内容的行上:

char *tempName = new char[strlen(tempString + 1)];

我已将其更改为:

char *tempName = new char[strlen(tempString) + 1];

我从 strlen() 括号中取出“1”。

为什么会有所作为?这里发生了什么?

标签: c++memorydynamicc-strings

解决方案


显然不是因为delete[]。你需要踏入setPromo。最后你错过了delete newGroup;函数末尾的。“dgsomerton”提出了一个很好的观点:

char *tempName = new char[strlen(tempString + 1)];

这实际上导致比需要的少两个字节和缓冲区溢出。随机错误并不奇怪。修复到:

char *tempName = new char[strlen(tempString)+1];

这就是为什么我更std::string喜欢char*.


推荐阅读