0

因为我在本科课程的大部分时间里都被Java录制了,所以我对C++比较新手(这是一个耻辱)。内存管理一直很麻烦,但我已经购买了许多关于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'持有的内存,在它通过一些参数后再次使用。这可能是一个很好的理由,但是应该有一些方法来释放内存,就像这个配置一样,没有办法访问数据的原始所有者(指针)。

+0

你的'原始'缓冲区在哪里被使用? 'cstr'应该是'original'吗? – mch 2010-04-12 04:04:03

+1

你有什么问题?是否有编译器错误?除了变量名称错误,以及我不了解你想用“剃须”完成什么,完全是什么问题?如果你认真对待使用C++,你应该使用'std :: string'而不是'char *',并且完全避免整个内存管理混乱。 – mch 2010-04-12 04:06:46

+0

而且cstrn应该是cstr? – 2010-04-12 04:07:05

回答

1

我假设你会替换originalcstr,否则代码将不编译为cstr没有声明。

这里的错误是分配数组的大小太小。你想char* ncstr = new char[len+1];帐户的终止\0

另外,如果你在函数返回后立即删除shaved,有在调用该函数是没有意义的......

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

0

假设你想用cstr而不是cstrn ...

你不应该删除cstr。您应该删除shaved

您只有delete分配了new的内存。 delete[]内存分配new[]

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