我正在尝试学习C ++,在这个过程中我尝试编写一个函数,它获取两个char指针并将第二个连接到第一个(我知道有strcat
这个)。
但是 - 我想要完成的是修改第一个参数指针,使其指向结果。因此我在第一个参数中使用了对指针的引用。
在从函数返回之前,我想释放第一个参数内存,但是我收到错误。
以下是代码:
void str_cat(char*& str1, char* str2)
{
if (!str1)
{
str1 = str2;
return;
}
if (!str2)
return;
char * new_data = new char[strlen(str1) + strlen(str2) +1];
char * new_data_index = new_data;
char * str1_index = str1;
char * str2_index = str2;
while(*str1_index)
*new_data_index++ = *str1_index++;
while(*str2_index)
*new_data_index++ = *str2_index++;
*new_data_index = NULL;
delete str1; //ERROR HERE (I also tried delete[] str1)
str1 = new_data;
}
我不明白为什么 有什么建议吗?
谢谢,
伊泰\
修改 这是我如何使用函数
char * str1 = NULL;
char * str2 = NULL;
str_cat(str1, "abc");
str_cat(str2, "def");
str_cat(str1, str2);
答案 0 :(得分:7)
如果您的代码如下所示,则只能删除使用new分配的内容:
str_cat( "foo", "bar" );
这将是非法的。基本上,您的功能完全不安全。更好的设计是通过函数的返回值返回新字符串。更好的是,忘记整个想法并使用std :: string。
虽然学习使用对指针的引用是一件值得称道的事情,但你应该知道它们在C ++编程中很少使用。建议您花时间学习使用C ++标准库的功能。
答案 1 :(得分:3)
第一次调用str_cat()
会为str1
分配您传入的字符串文字"abc"
的地址。
在第三次调用时,这会成为一个问题,因为您正在尝试delete
str1
,正如Neil所指出的那样,这对于字符串文字来说是非法的。