Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::string::assign take是否为;所有权“;绳子的长度?_C++_String - Fatal编程技术网

C++ std::string::assign take是否为;所有权“;绳子的长度?

C++ std::string::assign take是否为;所有权“;绳子的长度?,c++,string,C++,String,我在理解string::assign方法方面有一些差距。考虑下面的代码: char* c = new char[38]; strcpy(c, "All your base are belong to us!"); std::string s; s.assign(c, 38); 是否s.assign分配一个新的缓冲区并将字符串复制到该缓冲区中,或者它拥有指针的所有权;i、 不分配新内存,直接使用我的地址。如果它复制,那么assign和operator=之间有什么区别?如果它不复制,那么它是释放内

我在理解
string::assign
方法方面有一些差距。考虑下面的代码:

char* c = new char[38];
strcpy(c, "All your base are belong to us!");
std::string s;
s.assign(c, 38);
是否
s.assign
分配一个新的缓冲区并将字符串复制到该缓冲区中,或者它拥有指针的所有权;i、 不分配新内存,直接使用我的地址。如果它复制,那么
assign
operator=
之间有什么区别?如果它不复制,那么它是释放内存还是我的责任

多谢各位

s.assign是否分配新缓冲区并将字符串复制到其中,或者它是否拥有指针的所有权

STL字符串方法
assign
将字符数组复制到字符串中。如果字符串中已分配的缓冲区不足,它将在内部重新分配内存。STL字符串将获得原始数组的所有权

如果它复制,那么assign和operator=之间的区别是什么

两者应该以相同的方式工作,但是STL assign方法有许多重载,可以让您更好地控制发生的事情。有关更多信息,请参阅

更新:各种
assign
重载的类型

如果它不复制,那么它是释放内存还是我的责任


不,指向字符数组的原始指针仍然是您的责任。

据我所知,这取决于编译器的实现。有些可能使用写时复制优化,因此在修改值之前不会创建副本。 但是,大多数实现只会复制字符串

但是,所有的实现都会进行清理,因此无需手动释放字符串内存(这就是字符串对象的全部内容)。 当然,如果在堆上创建字符串对象(或使用智能指针),则必须释放字符串对象;)


Assign和operator=可以相互实现,因为它们执行相同的操作-取决于调用Assign的版本(对于所有重载,请参阅)。

它复制。和之间的区别在于,您可以指定要复制的字符数,包括空字符。运算符=仅将c字符串复制到第一个空字节。

写入时复制只能在将一个字符串分配给另一个字符串时使用-在分配字符*时不能使用它。绝对没有办法使
std::string
拥有您拥有的指针,句点:(