通过指针删除非自有动态数组 当我在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
。不要责怪编译器。代码失败是有原因的。很可能是由于脱离阵列的末尾而导致内存损坏。