c++ - 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()
再次到达时显示删除错误
解决方案
问题出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::vector
and std::string
。那么你也不必担心内存泄漏。
推荐阅读
- modelica - Modelica 中的解码器有什么问题?
- jquery - 当分辨率低于一定数量的像素时更改分割顺序
- javascript - 接收来自多个帐户的消息
- .net - 如何在 c# 中的 Registry.CurrentUser.OpenSubKey 中设置以管理员身份运行?
- php - PHP-Ajax:带有下拉菜单的实时搜索并在点击时赋值
- twig - 有条件地渲染带有回退的 twig 变量
- python - 为什么 Python 在从 Pandas 系列中提取时似乎忽略了通配符?
- python - 优化 pandas 数据帧适用于解码 CAN 帧 - 遍历行
- r - 为什么在 R 中使用 pagedown 制作的 html cv 的 Google chrome 打印会在页面中留下空白?
- r - 使用闪亮的输入、文本和希腊字母向 ggplot 添加标题