通过指针删除非拥有的动态数组

时间:2010-04-12 04:00:40

标签: c++ pointers memory-management dynamic-data delete-operator

对于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[]

为了防止泄漏,我想释放“剃光”所持有的内存,以便在通过一些参数后再次使用。可能有一个很好的理由说明为什么这会受到限制,但应该有一些方法来释放内存,因为这种配置,没有办法访问数据的原始所有者(指针)。

2 个答案:

答案 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[]分配的内存的内存地址。