我在 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[]
.
为了防止泄漏,我想释放 'shaved' 持有的内存,以便在它通过一些参数后再次使用。这可能有一个很好的理由来限制它,但是应该有一些方法来释放内存,因为通过这种配置,没有办法访问数据的原始所有者(指针)。