C++发行版中的内存分配(Visual Studio 2010) 我试图学习C++,在这个过程中,我试图编写一个函数,它得到两个字符指针,并将第二个指针连接到第一个指针,我知道这里有一个Strut。 但是-我想完成的是修改第一个参数指针,使其指向结果。出于这个原因,我在第一个参数中使用了对指针的引用

C++发行版中的内存分配(Visual Studio 2010) 我试图学习C++,在这个过程中,我试图编写一个函数,它得到两个字符指针,并将第二个指针连接到第一个指针,我知道这里有一个Strut。 但是-我想完成的是修改第一个参数指针,使其指向结果。出于这个原因,我在第一个参数中使用了对指针的引用,c++,memory-management,C++,Memory Management,在从函数返回之前,我想释放第一个参数内存,但我得到一个错误 代码如下: 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 * s

在从函数返回之前,我想释放第一个参数内存,但我得到一个错误

代码如下:

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);

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

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

虽然学习使用指针来引用是值得称赞的事情,但是你应该注意到它们在C++编程中很少使用。你最好花些时间学习使用C++标准库的特性。

< P>第一次调用StryCAT会导致STR1被分配给你所传入的字符串文字ABC的地址。
随着第三调用这成为一个问题,因为您正在尝试删除STR1,正如尼尔指出的,对于字符串文字是非法的。< /P>调用代码是如何创建传入的缓冲区的?我正在尝试学习C++,然后使用STD::string代替C风格字符串。@ Georg Fritzsche -我尝试使用StryCasTr1,aaa,但后来意识到第二个参数不是在堆中分配的,而是在堆栈中分配的,所以我将其更改为newchar[]。。。但仍然不起作用。@Prasoon Saurav-我编写这个函数的目的是理解对指针的引用。和内存使用情况。@Itay:对于分配给new[]的内存,始终使用delete[]。我编辑了问题以显示使用情况。在任何情况下-我在这里的目的是传递一个空指针并在其中获取一个值。@Itay它仍然无法工作,原因有很多。基本上这是一个糟糕的设计,不能在C++中安全地实现。@ Neil Butterworth:我的设计很糟糕。但仍然-为什么它不起作用?谢谢:有没有测试释放内存位置是否合法的方法?@Itay没有,没有,这就是函数设计不好的原因。@Itay:没有,这就是为什么你不应该使用这种人为的方法。您可以要求调用方传入一个足够大的缓冲区,也可以总是返回一个新分配的缓冲区,并记录应该如何释放它。或者,如前所述,根本不要这样做-使用std::string、std::vector等可以立即解决所有问题。