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
拥有您拥有的指针,句点:(