因为我在本科课程的大部分时间里都被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'持有的内存,在它通过一些参数后再次使用。这可能是一个很好的理由,但是应该有一些方法来释放内存,就像这个配置一样,没有办法访问数据的原始所有者(指针)。
你的'原始'缓冲区在哪里被使用? 'cstr'应该是'original'吗? – mch 2010-04-12 04:04:03
你有什么问题?是否有编译器错误?除了变量名称错误,以及我不了解你想用“剃须”完成什么,完全是什么问题?如果你认真对待使用C++,你应该使用'std :: string'而不是'char *',并且完全避免整个内存管理混乱。 – mch 2010-04-12 04:06:46
而且cstrn应该是cstr? – 2010-04-12 04:07:05