0

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

4

2 回答 2

1

我假设您将替换originalcstr,否则代码将无法编译,因为cstr未声明。

这里的错误是分配的数组的大小太小。您要char* ncstr = new char[len+1];考虑终止\0.

另外,如果您shaved在函数返回后立即删除,则调用该函数毫无意义...

[*] 更深入一点,用于的内存cstr将在包含函数返回时被释放。通常,此类静态字符串被放置在在应用程序的整个期间都存在的常量中。例如,您可以拥有const char* cstr="abcde";所有功能之外的功能。然后你可以传递这个字符串而不必动态分配它。

于 2010-04-12T04:09:02.157 回答
0

假设您打算使用cstr而不是cstrn...

你不应该删除cstr. 你应该删除shaved.

你只有delete被分配的内存new。以及delete[]分配给new[].

shaved只是一个保存内存地址的变量。您将该内存地址传递delete[]给以摆脱内存。 shaved保存用 分配的内存的内存地址new[]

于 2010-04-12T04:09:29.570 回答