c ++问题中的内存释放(Visual Studio 2010)

时间:2010-07-10 12:51:27

标签: c++ memory-management

我正在尝试学习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);

2 个答案:

答案 0 :(得分:7)

如果您的代码如下所示,则只能删除使用new分配的内容:

str_cat( "foo", "bar" );
这将是非法的。基本上,您的功能完全不安全。更好的设计是通过函数的返回值返回新字符串。更好的是,忘记整个想法并使用std :: string。

虽然学习使用对指针的引用是一件值得称道的事情,但你应该知道它们在C ++编程中很少使用。建议您花时间学习使用C ++标准库的功能。

答案 1 :(得分:3)

第一次调用str_cat()会为str1分配您传入的字符串文字"abc"的地址。
在第三次调用时,这会成为一个问题,因为您正在尝试delete str1,正如Neil所指出的那样,这对于字符串文字来说是非法的。