对于C ++而言,我相对比较新手,因为我在本科课程的大部分时间里都是Java(这是一种耻辱)。内存管理一直很麻烦,但我已经购买了很多关于ansi C和C ++的书籍。我已经探讨了相关问题,但找不到符合这一特定标准的问题。也许很明显没人提到它?
这个问题一直困扰着我,但我觉得好像有一个概念点,我没有利用。
假设:
char original[56];
cstr[0] = 'a';
cstr[1] = 'b';
cstr[2] = 'c';
cstr[3] = 'd';
cstr[4] = 'e';
cstr[5] = '\0';
char *shaved = shavecstr(cstr);
// various operations, calls //
delete[] shaved;
其中,
char* shavecstr(char* cstr)
{
size_t len = strlen(cstr);
char* ncstr = new char[len];
strcpy(ncstr,cstr);
return ncstr;
}
在这一点上,重点是让'原创'成为一个充满角色的缓冲区,并且通常会将其副本剃掉并在其他地方使用。
为了澄清,原件通过std::gets(char* buff)
,std::getline(char* buff, buff_sz)
,std::read(char* buff, buff_sz)
或任何就地填充输入阅读器填充。为了“刮”一个字符串,它基本上被截断,消除了未使用的数组空间。
错误是堆分配错误,并且delete[]
。
为了防止泄漏,我想释放“剃光”所持有的内存,以便在通过一些参数后再次使用。可能有一个很好的理由说明为什么这会受到限制,但应该有一些方法来释放内存,因为这种配置,没有办法访问数据的原始所有者(指针)。
答案 0 :(得分:1)
我假设您将original
替换为cstr
,否则代码将无法编译,因为cstr
未声明。
这里的错误是分配的数组的大小太小。您希望char* ncstr = new char[len+1];
考虑终止\0
。
此外,如果您在函数返回后立即删除shaved
,则无需调用该函数...
[*]为了更深入,当包含函数返回时,将释放用于cstr
的内存。通常这种静态字符串放置在应用程序的整个持续时间内的常量中。例如,您可以在所有功能之外使用const char* cstr="abcde";
。然后你可以传递这个字符串,而不必动态分配它。
答案 1 :(得分:0)
假设您打算使用cstr
代替cstrn
...
您不应该删除cstr
。您应该删除shaved
。
您只delete
使用new
分配的内存。和delete[]
分配的new[]
内存。
shaved
只是一个包含内存地址的变量。您将该内存地址传递给delete[]
以消除内存。 shaved
保存使用new[]
分配的内存的内存地址。