内存删除在C ++中失败

时间:2018-10-27 22:33:30

标签: c++

我正在尝试编写莫尔斯电码程序。

当我通过单词时,它会分配一个char *长度的内存,而对于每个字母,则会分配一个摩尔斯字母长度的内存。经测试,它工作正常,但是当我添加功能块clear()删除分配的内存时,它崩溃了(_CRT_SECURITYCRITICAL_ATTRIBUTE). 你能告诉我我哪里做错了吗?

第一部分

class morse
{
private:
convert converter;
.
.

构造函数:

morse::morse()
    :converter()
{
}

和一些转换方法

class convert
{
protected:
    char** letter;
    int size;
.
.
.


convert::convert()
    :letter(0), size(20)
{
    letter = new char*[20];
    for (int i = 0; i < 20; i++)
        letter[i] = new char[4];
}

convert::~convert()
{
    clear();
}

void convert::clear()
{
    if (size != 0)
    {
        for (int i = 0; i < size; i++)
            delete[] letter[i];
        delete[] letter;
    }

    size = 0;
    letter = new char*;
}


void convert::translate(const char * x)
{
    clear();
    size = strlen(x);
    letter = new char*[strlen(x)+1];



    for (int i = 0; i < strlen(x); i++)
    {
        switch (x[i])
        {
        case 'a': case 'A':
            save(i, "._");
            break;
        case 'b': case 'B':
            save(i , "_...");
            break;
        case 'c': case 'C':
            save(i, "_._.");
            break;
.
.
.
.


void convert::save(int i, const char * lol)
{
    letter[i] = new char[strlen(lol) + 1];
    letter[i] = const_cast<char*>(lol);
}

它一次工作正常,它删除构造函数分配的内存,并轻松地翻译整个单词,但是当我给它另一个单词时,当它再次到达clear()时,它会显示删除错误

2 个答案:

答案 0 :(得分:3)

问题出在save函数中,您需要这样做:

letter[i] = new char[strlen(lol) + 1];
letter[i] = const_cast<char*>(lol);

第一行使letter[i]指向您分配的内存。然后,直接将其指向传递给save函数的文字字符串。而且文字字符串不是您可以delete[]使用的东西。

这基本上等同于

int l;
l = 5;
l = 10;

,然后想知道为什么l不再等于5

解决此问题的方法是不分配第二个赋值,并使用std::strcpy函数复制字符串。

或者更好的是,根本不使用指针,而使用std::vectorstd::string。这样您就不必担心内存泄漏了。

答案 1 :(得分:0)

(已删除,我不正确。我自己看不到如何删除它)