首页 > 解决方案 > 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()再次到达时显示删除错误

标签: c++

解决方案


问题出save在您拥有此功能的功能中:

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

第一行 makeletter[i]指向您分配的一些内存。然后你直接让它指向你传递给save函数的文字字符串。文字字符串不是你能做delete[]的。

这基本上相当于

int l;
l = 5;
l = 10;

然后想知道为什么l不等于5了。

解决这个问题的方法是不进行第二次赋值,使用std::strcpy函数复制字符串。

或者,更好的是,根本不使用指针,而是使用std::vectorand std::string。那么你也不必担心内存泄漏。


推荐阅读