std :: string :: assign是否取得字符串的“所有权”?

时间:2010-07-12 13:20:46

标签: 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是否分配新缓冲区并将字符串复制到其中,或者它是否拥有指针的所有权;即不分配新内存并直接使用我的地址。如果它复制,那么assignoperator=之间有什么区别?如果它没有复制,那么它是否释放了内存,或者这是我的责任?

谢谢。

3 个答案:

答案 0 :(得分:29)

  

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

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

  

如果它复制,那么assign和operator =?

之间的区别是什么

两者都应该以相同的方式行动,但STL分配方法有许多重载,可以让您更好地控制发生的事情。有关详细信息,请查看this page

更新:各种assign重载的MSDN has a number of examples

  

如果它没有复制,那么它是否释放了内存,或者这是我的责任?

不,指向角色阵列的原始指针仍然是你的责任。

答案 1 :(得分:15)

它复制。 assignoperator=之间的区别在于您可以指定要复制的字符数包括空字符。 operator =只是将c-string复制到第一个空字节。

答案 2 :(得分:1)

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

但是,所有实现都会处理清理 - 所以不需要手动释放字符串内存(这就是字符串对象的全部内容)。 当然,如果在堆上创建(或使用smartpointer),你必须释放你的字符串对象;)

Assign和operator =可以相互实现,因为它们做同样的事情 - 取决于调用哪个版本的赋值(对于所有重载,请参见cpp reference)。