我正在尝试编写莫尔斯电码程序。
当我通过单词时,它会分配一个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()
时,它会显示删除错误
答案 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::vector
和std::string
。这样您就不必担心内存泄漏了。
答案 1 :(得分:0)
(已删除,我不正确。我自己看不到如何删除它)