通过指针删除非自有动态数组 当我在java上学习了很多课程时,我比较喜欢C++。内存管理一直是个麻烦,但我已经购买了一些关于ANSI C和C++的书。我已经翻遍了相关的问题,但找不到一个符合这个特定标准的问题。也许很明显没人提过
这个问题一直困扰着我,但我觉得似乎有一个概念点我没有利用 假设:通过指针删除非自有动态数组 当我在java上学习了很多课程时,我比较喜欢C++。内存管理一直是个麻烦,但我已经购买了一些关于ANSI C和C++的书。我已经翻遍了相关的问题,但找不到一个符合这个特定标准的问题。也许很明显没人提过,c++,pointers,memory-management,dynamic-data,delete-operator,C++,Pointers,Memory Management,Dynamic Data,Delete Operator,这个问题一直困扰着我,但我觉得似乎有一个概念点我没有利用 假设: 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(cha
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[]
上出现segs
为了防止泄漏,我想释放“shaved”持有的内存,以便在它通过一些参数后再次使用。这可能是受到限制的一个很好的原因,但是应该有一些方法来释放内存,因为通过此配置,无法访问数据的原始所有者(指针)。我假设您将用
cstr
替换原始的,否则代码将不会编译,因为未声明cstr
这里的错误是分配的数组太小。您需要char*ncstr=newchar[len+1]代码>以说明终止的\0
此外,如果在函数返回后立即删除shaved
,则调用函数没有意义
[*]更深入一点,当包含函数返回时,用于cstr
的内存将被释放。通常,此类静态字符串被放置在在在整个应用程序期间有效的常量中。例如,您可以有const char*cstr=“abcde”代码>超出所有功能。然后您可以传递这个字符串,而不必动态分配它。假设您打算使用cstr
而不是cstrn
您不应该删除cstr
。您应该删除shaved
您只能删除分配给new
的内存。和delete[]
使用new[]
分配的内存
shaved
只是一个保存内存地址的变量。将该内存地址传递给delete[]
以清除内存shaved
保存使用new[]分配的内存的内存地址
您的原始
缓冲区在哪里?cstr
应该是original
?您有什么问题?是否存在编译器错误?除了变量名有误,我不明白你想通过“剃须”实现什么,问题到底是什么?如果你真的在使用C++,你应该使用<代码> STD::String 而不是< Calth> char */Cuff>,并且完全避免整个内存管理混乱。CSTRN应该是CSTR吗?哦,是的,你忘记为空终止符分配空间,所以<代码> StrcPy < /Cord>正在写下你的数组的末尾。如果必须使用C风格的字符串,请选择strncpy
。不要责怪编译器。代码失败是有原因的。很可能是由于脱离阵列的末尾而导致内存损坏。